Caffe框架解析(训练和测试数据流向)

来源:互联网 发布:从元数据 编辑:程序博客网 时间:2024/05/29 18:16

经过对Caffe代码的阅读,大致了解了Caffe整个执行流程。借此,想写一篇博客,加深自己的理解,同时希望大家多多指教。
这里写图片描述
注:图中虚线框表示的是虚函数,通常通过子类进行实现;黑色流程线表示的是代码执行过程,紫色流程线表示的是数据流动过程。
1、 当配置proto文本,运行Caffe框架时,首先是通过SolverFactory根据proto文件中配置的优化算法,创建Solver实例。目前,Caffe代码提供了6中优化算法:
l Stochastic Gradient Descent (type: “SGD”):对应SGDSolver类
l AdaDelta (type: “AdaDelta”):对应AdaDeltaSolver类
l Adaptive Gradient (type: “AdaGrad”):对应AdaGradSolver类
l Adam (type: “Adam”):对应AdamSolver类
l Nesterov’s Accelerated Gradient (type: “Nesterov”):对应NesterovSolver类
l RMSprop (type: “RMSProp”):对应RMSPropSolver类
每一种Solver子类都会实现ApplyUpdate函数,进行更新权重,其中通常在solver.proto文件中定义的base_lr、momentum和weight_decay都会被ApplyUpdate函数直接或者间接计算使用。
2、 在得到Solver实例后,接着会解析train_testnet.proto文件,创建Net对象,并通过LayerFactory产生Layer实例,并根据proto文件中参数设置Layer实例,最后保存到Net对象中。初始化工作完成之后,会调用Solve函数,Solve函数会显示一些log信息,并调用Step函数。
3、 Step函数是训练模型的核心函数。Step函数会调用Net对象的ForwardBackward函数进行优化模型,计算模型的损失函数(每计算batchsize*itersize多个样本,求一次损失函数)。同时根据snapshot和test_interval来决定调用TestALL函数和Snapshot函数,进行校验和保存临时模型。
4、 Net对象在构成函数中,会调用Init函数,Init函数中,会对Layer对象进行一些配置,比如设置参数,对Blob进行Reshape操作,对DataLayer对象进行加载数据。
5、 Net对象的ForwardBackward函数调用时,分别会调用Forward和Backward函数,而Forward和Backward函数会依次调用Layer对象中的Forward和Backward函数。
6、 Layer对象中的Forward函数和Backward函数,会根据配置文件中指定的运行模式,来决定调用gpu还是cpu进行计算。Forward函数会调用子类中实现的Forwardcpu或者Forwardgpu函数,结合weight和bottom,计算得到top。
7、 Layer对象中的Backward函数,会根据配置文件来决定该Layer是否需要计算梯度,如果需要,则集合bottom和top,计算得到weight_diff。
8、 在经过一轮迭代之后,Step函数,会调用ApplyUpdate函数,更新Layer中的weight参数。

0 0
原创粉丝点击