分布式专题——判断因果关系的向量时钟算法

浅析时钟向量算法 狭义相对论可以用洛伦兹变换将不同的参考系中的时间进行变换(利用到不同参考系之间的相对速度),但是向量时钟算法不可以(其实逻辑上也可以,但是实现后没有现实意义),所以只能用多维的时间来表征不同节点中的时间却没法相互转化。 阅读详情

今天的文章来聊聊向量时钟,在前文介绍分布式系统一致性的时候,曾经介绍过,在弱一致性模型当中会有一个因果性的问题。向量时钟算法正是设计出来解决因果关系问题的。


我们来回顾一下因果问题,在实际日常的网页行为当中,部分行为存在因果关系。比方说知乎里面回答问题,显然得先有一个同学提出问题,然后才能有各路大V谢邀解答问题。但是由于是分布式系统,有可能问题和回答并不是存放在同一台机器,导致有可能它们更新的顺序不一致,所以就有可能会出现用户在访问知乎的时候,发现自己关注的大V回答了某个问题,但是点进去问题却是空的。这种幽灵情况不是灵异事件,只是单纯的分布式系统设计没过关,没有考虑因果问题。


有的同学可以会说,这个不难啊,我们加入时间戳啊。时间戳的确可以解决一部分问题,但是并不能解决所有问题。有了时间戳之后,我们可以获得事件发生的时间,但是仍然不知道不同的数据之间的因果关系。由于分布式系统存在延迟,也不能简单地通过时间戳来做过滤或者筛选。不过,虽然单纯的时间戳不行,但已经非常接近了。


我们日常生活当中用事件发生的时间来反应事物发生的顺序,我们说的先后顺序,其实是以客观上的时间作为参考系参考得到的结果。问题来了,我们能不能找到或者构造出其他的参考系来反应事物发生的顺序呢?


当然是可以的,不然也没有这篇文章了,这就是大名鼎鼎的逻辑时钟算法。多说一句,逻辑时钟算法和许多其他分布式算法一样,同样源于大神Lamport的发明。


逻辑时钟


我们还用之前的例子来思考一下,一个人在知乎提交了问题,另一个人回答了问题,这是两个事件。我们第一反应自然是通过两个事件发生的时间来反应因果顺序,但我们仔细分析一下这个场景。后面那个人既然能回答问题,说明他一定是看到了问题。也就是说回答问题和看到问题之间发生了交互,所以很自然地可以想到,我们是不是可以用两个系统或者是两个事件之间有没有发生过信息交互来反应因果顺序呢?


于是基于这个思想,Lamport大神提出了逻辑时钟的概念。逻辑时钟概念的核心就是刚才我们说的,两个事件之间建立因果关系的前提是,两个事件之间发生过信息传递。


我们梳理一下可能发生的事件的种类,可以分成三种。第一种是发生在某个节点内部,也就是说没有和其他任何节点发生联系。第二种是发送事件,是事件的发送方。第三种是接收事件,和第二种对应,是事件的接收方。明确了这三点之后,我们就可以用时间戳来表示这三种情况了。首先,我们假设每个节点内部都会维护一个时间戳,记录当下节点的状态。


针对上面说是三种时序关系呢,我们设定三种策略。


首先是内部事件,对于节点内部发生事件呢,很简单,我们只需要将它的时间戳增大1,表示发生过了某件事情。


其次是发送事件,节点内部的时间戳自增1,并且在发送消息当中加上这个时间戳。


最后是接收事件,由于会额外接收到一个时间戳,所以我们需要利用这个时间戳来更新节点内部的时间戳。更新的方法也很简单,假设节点内部的时间戳是ttt,跟着消息传递而来的时间戳是t′t't′, 那么: tnew=max(t+1,t′)t_{new} = max(t + 1, t')tnew​=max(t+1,t′)。


我们分析一下上面这个关系,假设当下有事件A和B,如果事件A是事件B发生的前提。那么显然事件A的时间戳小于事件B。如果反过来,事件A的时间戳小于B,能说明事件A是事件B的前提吗?并不能,所以时间戳较小是因果关系的必要条件,但不是充分条件。


由于会存在多个节点或者进程时间戳相等的情况,所以我们把进程id也作为比较的银子。我们用C表示一个事件的时间戳,P表示事件的进程pid。如果事件A排在事件B前面,只有两种可能:


  1. C(A)<C(B)C(A) < C(B)C(A)<C(B)
  2. C(A)=C(B),P(A)<P(B)C(A) = C(B), P(A) < P(B)C(A)=C(B),P(A)<P(B)

我们来看一个例子:

上图当中有A、B和C三个进程,其中P(A) < P(B) < P©。图中每一个箭头都代表传递的消息。


我们根据重新定义的时序关系,可以得到这些点的先后顺序是:


C1⇒B1⇒B2⇒A1⇒B3⇒A2⇒C2⇒B4⇒C3⇒A3⇒B5⇒C4⇒C5⇒A4


如果仔细观察这条链的话会发现它并不能真实反映事件发生的顺序,会存在不公平的情况。但至少因果关系可以保证。


以上这个算法被称为是逻辑时钟算法,它相当于重新定义了一个逻辑上的时间来代替真实物理世界的时间。由于它是Lamport大神提出的,所以也被称为是Lamport逻辑时钟算法。


向量时钟


在上面的文章当中我们也分析了,逻辑时钟算法有一个问题是虽然保证了因果顺序,但也牺牲了公平。比如上图当中B3和A2发生在同一时间,但是B3排在A2的前面。也就是说我们通过比较C(A)C(A)C(A)和C(B)C(B)C(B)无法得出真实的发生顺序。


为了解决这个问题,大神们在Lamport的逻辑时钟上做了改进,提出了向量时钟算法。


向量时钟和逻辑时钟的原理几乎一样,只不过对于每个节点或者进程而言,它维护的不再是一个单个的时间戳,而是一个<

大数据领域分布式计算的分布式版本控制 数据版本:ETL流程中不同批次数据的 lineage追踪代码版本:分布式作业脚本的迭代与集群部署一致性配置版本:集群参数、资源调度策略的动态更新管理执行计划版本:DAG任务流的优化迭代与容错恢复本文聚焦分布式计算环境下的全要素版本控制体系,覆盖技术原理、算法实现、工程实践及工具链整合,适用于分布式系统架构设计、大数据开发及DevOps团队。核心概念:定义分布式版本控制的核心要素,构建技术架构模型算法原理:解析向量时钟、CRDT等冲突消解算法,附Python实现数学模型。 阅读详情

相关推荐

破解数据同步难题:分布式架构下多节点一致性策略与实时性平衡技巧

读写分离 + 关键路径强一致:普通读请求路由至从节点(最终一致性,低延迟),支付、库存等写请求走主节点 + 共识算法(强一致性)。时间窗口一致性:设定同步超时阈值(如 500ms),若超时则降级为最终一致性,避免请求长期阻塞。分布式架构下的数据同步难题,本质是 “业务需求、一致性强度、实时性要求” 三者的动态平衡。基于业务优先级选择合适的一致性策略(如金融选强一致,社交选最终一致);通过分片、异步批量、就近同步等技巧优化实时性,减少不必要的延迟;

yvysh16116的博客 961

分布式系统同步是指在分布式系统中,通过特定的机制和算法协调多个节点(计算机或进程),以确保数据一致性、任务协调和事件顺序正确

结合您之前的问题(SpinLock、CRITICAL_SECTION、Monitor、Wait/Pulse、进程间同步等),本回答将详细解析分布式系统同步的机制,涵盖核心概念、常见方法、C# 实现、测试用例、最佳实践,以及与进程间同步和线程同步的关联。由于分布式系统的节点具有独立的时钟、内存和处理能力,且通过网络通信,同步面临诸多挑战,如网络延迟、节点故障、时钟漂移等。2. 分布式系统同步机制详解以下是分布式系统常用的同步机制,结合搜索结果(、、等)。示例:简化的 CDC(C# 模拟)csharp。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 228

大数据日知录:架构与算法 笔记

大数据日知录:架构与算法 跳转至: 导航、 搜索 目录 1 当谈论大数据时我们在谈论什么2 数据分片与路由3 数据复制与一致性4 大数据常用算法与数据结构5 集群资源管理与调度6 分布式协调系统7 分布式通信8 数据通道9 分布式文件系统10 内存KV11 列式数据库12 大规模批处理13 流式计算14 交互式数据分

cteng的专栏 2643

基于向量时钟的 Harness 因果序追踪

概念定义因果序追踪分布式系统中,判断多个事件之间的(先发生)因果关系,按照因果依赖对事件进行排序的技术,核心目标是还原事件的真实发生逻辑,而不是依赖不可靠的物理时间戳向量时钟(Vector Clock)一种用于捕获分布式系统事件因果关系的逻辑时钟算法,通过维护一个逻辑计数器数组(向量),实现对事件因果关系的双向判断:不仅可以判断A是否发生在B之前,还可以判断两个事件是否是并发关系Harness平台。

AI云原生与云计算技术学院 333

9、向量时钟的高效实现与相关技术解析

本文详细解析了向量时钟在分布式计算中的高效实现技术,包括Singhal–Kshemkalyani的差分技术、Fowler–Zwaenepoel的直接依赖技术以及Jard–Jourdan的自适应技术。文章介绍了这些技术的原理、实现方式、优缺点以及适用场景,并对比了它们在消息大小、依赖关系维护和实时性方面的差异。此外,还探讨了执行维度的概念及其对分布式系统性能的影响,最后展望了向量时钟未来的研究方向和优化潜力。

CAT789的专栏 54

35、基于布卢姆时钟的因果关系测试及其应用

本文详细介绍了布卢姆时钟的工作原理及其在分布式系统中捕捉事件因果关系的应用。通过与向量时钟的对比实验,展示了布卢姆时钟在大规模分布式系统中的性能优势,并探讨了其在数据库和日志系统中的实际应用场景。同时,文章分析了影响布卢姆时钟性能的关键参数,并提出了未来优化方向。

cake8的博客 125

27、分布式系统中的协调机制:逻辑时钟与互斥算法

本文深入探讨了分布式系统中的协调机制,重点介绍了逻辑时钟和互斥算法。逻辑时钟用于确定事件的时间顺序,Lamport时钟和向量时钟分别适用于全序排序和因果关系判断。互斥算法包括基于令牌和基于权限的解决方案,它们各有优缺点,适用于不同场景。文章还分析了逻辑时钟与互斥算法的结合应用,以及面对网络延迟、消息丢失、进程故障等挑战的解决方案。最后,总结了协调机制的重要性,并展望了未来的研究方向。

lake5的博客 59

50、分布式系统中的逻辑时间、逻辑时钟与全局状态

本文探讨了分布式系统中逻辑时间、逻辑时钟以及全局状态的相关概念和应用。由于物理时钟同步的困难,分布式系统采用逻辑时钟(如 Lamport 时钟和向量时钟)来确定事件的因果顺序。文章还详细介绍了全局状态的概念、一致切割的定义,并以 Chandy 和 Lamport 的快照算法为例,分析了记录一致全局状态的方法及其在死锁检测、垃圾回收和分布式调试等方面的应用。这些技术为理解和管理分布式系统的复杂行为提供了重要支持。

j0k1l2m3n的博客 79

一只永不关门的购物车:Amazon Dynamo的环形分区、可调仲裁与去中心化自愈解析

本文以亚马逊“永远可写”的购物车为线索,系统拆解Dynamo的设计:从P99.9延迟契约与设计前提出发,讲清一致性哈希、虚拟节点与三种token分配策略如何兼顾均衡、搬迁与元数据;首选列表为何要按物理机和故障域去重;向量时钟如何识别版本分叉,并集合并为何让删除复活、OR-Set如何修正;N、R、W如何权衡延迟与一致性,草率仲裁下R+W>N为何仍会旧读;暗示移交、Merkle树反熵与Gossip如何自愈。四个Java实验给出实测数据,并对比Cassandra、Riak与DynamoDB的演进。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 12万+

Flink 逻辑时钟详解

逻辑时钟是描述分布式系统中时序和因果关系的一种机制。由于网络延迟、时钟漂移等现实问题,我们无法建立一个全局物理时钟来描述时序,因此区别于物理时钟的「逻辑时钟」机制应运而生。第一个逻辑时钟算法是由分布式领域的大神 Lamport 在 1978 年提出的 lamport 时钟算法。

悦分享 143

AmazonDynamoDB实战:云端NoSQL数据库

1. 背景介绍 1.1 云计算与NoSQL数据库的崛起 随着互联网的快速发展,数据量呈现出爆炸式增长,传统的关系型数据库在处理大规模、高并发、高可用的场景下逐渐暴露出性能瓶颈。为了应对这一挑战,NoSQL数据库应运而生,它们具有高可扩展性、高性能、高可用等特点,适用于处理大量非结构化数

AI天才研究院 246

51、分布式系统的异步与同步

本文深入探讨了分布式系统中的同步与异步操作模式,分析了两者的定义、特点及其对分布式算法设计的影响。重点讨论了异步系统模型面临的挑战及解决方案,包括向量时钟、故障检测器和分区容错共识算法等技术。同时,通过实际应用案例(如Cassandra、Dynamo、ZooKeeper)展示了异步系统的优点与局限性,并展望了未来研究方向。

jenkins8butler的博客 128

32、异步普适计算环境中并发属性的运行时检测

本文研究了异步普适计算环境中并发上下文属性的运行时检测方法,提出了基于逻辑向量时钟和一致全局状态格结构的CADA算法。通过形式化建模和理论证明,建立了上下文属性与并发活动之间的等价关系,并利用开源中间件MIPA实现了该算法。实验结果表明,CADA在异步环境下具有高准确性、及时性和适应性,能够有效应对上下文噪声和动态变化。

s1t2u3的博客 61

【CTFSHOW】web入门 黑盒测试

文章目录写在前面web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394web395参考资料 写在前面 一直没搞过渗透,先学学黑盒测试吧 web380 进入题目发现是一个关于灯泡的悲伤故事,点进去,看到跳转到page_1.php页面。 我们访问page.php试试: 发现报错:$id.php,可以猜想需要传名称为id的参数,来访问id.php。我们访问page.php?id=1试试

7ruth0hn的博客 1896

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 240

GPS定位不准?可能是GDOP在作怪!手把手教你优化卫星几何分布

本文深入解析了GPS定位精度不佳的常见原因——几何精度因子GDOP。通过剖析卫星几何分布对定位误差的放大效应,文章提供了从理解GDOP、PDOP、HDOP等关键指标,到使用专业APP实时诊断卫星天空图,再到利用在线工具提前规划最佳定位时机的完整实战指南。旨在帮助户外爱好者、无人机飞手及专业用户主动优化卫星几何条件,从而显著提升定位可靠性。

weixin_29062823的博客 304

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 431

yolov8 PTQ和QAT量化实战(源码详解)

量化():是指将高精度浮点数(FP32)转换为低精度(8bit或4bit)整数的过程,它是模型部署中的一种非常重要的优化方法,可以在较少的精度损失下,大幅提供神经网络的效率和性能。目前主流的神经网络量化方式有PTQ和QATPTQ是训练后量化(),无需数据集和训练,直接量化模型权重QAT是量化感知训练(),量化后需要在数据集上继续微调训练。QAT过程中,我们首先需要选择哪些层需要进行finetune训练,并利用FP32对应层的输出作为监督进行训练。

@bangbang的博客 5326

Altium Designer 超详细入门教程

本文是一份Altium Designer新手入门教程,详细介绍了从软件基础到PCB制版的全流程。主要内容包括:软件界面介绍与工程创建方法;原理图设计中的元件放置、电气连线、标注添加等操作;PCB设计的布局布线、铺铜和DRC检查;Gerber和钻孔文件的导出方法。教程还提供了分类整理的实用快捷键表和新手避坑指南,强调原理图编译和DRC检查的重要性。通过本教程,新手可以快速掌握AD基本操作,完成简单电路板的设计与制版文件导出。

学习中...... 812

基于FPGA的时间数字转换(TDC)设计(五:基于Carry4的高精度TDC设计)

基于FPGA的时间数字转换(TDC)设计,此为第五篇:基于Carry4的高精度TDC设计。提供工程文件及MATLAB测试分析代码

sdau2005的博客 8800

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: LeetCode 18: 4 Sum 寻找4数和
下一篇: LeetCode19 移除倒数第N个元素
TechFlow
博客等级 码龄7年 347粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值