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参数。
- Caffe框架解析(训练和测试数据流向)
- Caffe框架,训练model并测试数据
- caffe教程翻译:在caffe上训练与测试数据
- CAFFE框架训练
- 深度学习Caffe实战笔记(21)Windows平台 Faster-RCNN 训练好的模型测试数据
- caffe 实验中输入数据和label都是图片时,训练或测试数据列表train.txt生成方法(linux指令总结)
- 调用caffe进行网络训练(caffe.cpp 解析)
- 训练数据,验证数据和测试数据的概念(转)
- caffe测试数据
- caffe 训练和测试
- 训练数据、测试数据和验证数据
- 将数据划分为训练数据及测试数据(div_train_val.py 解析)
- 奔跑吧Caffe(在MNIST手写体数字集上用Caffe框架训练LeNet模型)
- 分配训练和测试数据集(python)——Faster-RCNN
- [caffe] 数据制作和训练
- 深度学习框架caffe训练过程
- 训练参数解析-以caffe为例
- caffe基础-10常见训练命令解析
- RecyclerView -- 更强大的滚动控件1
- spartan6 MCB调试中碰到的问题
- Java停止线程运行的三种方式
- Win10下安装TensorFlow
- Log4j配置使用的简单教程
- Caffe框架解析(训练和测试数据流向)
- Android的生命周期(三)--Activity的生命周期
- Gym 101246(ACM ICPC 2010-2011, NEERC, Southern Subregional Contest Russia, Saratov)
- PyQt IDE 环境搭建
- Java从入门到精通阅读笔记(第4版)12
- 螺旋方针(螺旋矩阵)
- 设置Dialog的显示宽度
- 《win32多线程程序设计》学习笔记四
- 关于verilog中if与case语句不完整产生锁存器的问题