Caffe学习之caffe具体运行流程分析
2017-07-08 11:50
155 查看
最近一段时间因实习需要,学习了一下caffe,在此陆陆续续记录一些和caffe相关的笔记。
我们都知道要运行一个caffe model的时候需要在命令行下输入:
然后模型就跑起来了,但是具体程序的入口——main是哪个,执行的顺序是如何的可能不是特别清晰,为了更加理解caffe,在此对其流程做一个具体的分析。
分析方法很简单,细看运行model之后的,输出的Log,比如在此运行lenet model:
你会得到如下Log:
观察程序运行的具体哪个.cpp 及哪一行代码,即可理解,因此可得caffe具体运行流程如下:
step1: 命令行下输入./build/tools/caffe train -solver xxx.prototxt 运行了程序的入口caffe.cpp main()
step2: caffe.cpp main()根据命令行输入的参数train 调用caffe.cpp train()
step3: caffe.cpp train()读取xxx.prototxt的参数 调用solver.cpp Solver()的构造函数创建Solver对象
step4: 创建Solver对象的时候需要调用solver.cpp Init()函数来初始化模型的网络
step5: solver.cpp Init()函数调用solver.cpp InitTrainNet()和InitTestNets()函数来分别初始化训练和测试网络。
step6: InitTrainNet() 通过xxx.prototxt 指定的xxxnet.prototxt读取net的参数,调用net.cpp Net()的构造函数,创建训练网络,
step7: net.cpp Net()调用net.cpp Init()函数,通过for循环来1)创建网络中每一个Layer对象,2)设置bottom和top,3)调用layer.cpp Setup()
step8: 调用InitTestNets()创建测试网络,与InitTrainNet()类似
step9: 运行返回到caffe.cpp train()中,利用创建好的solver对象调用solver.cpp Solve()函数
step10: solver.cpp Solve() 调用 solver.cpp Step()函数,while循环迭代的次数,每次迭代 1)调用net.cpp ForwardBackward()来前向以及后向传播 2)solve.cpp ApplyUpdate()更新参数 3)每一定轮次运行solver.cpp TestAll()
step11: 运行结束
可能有点绕,总结而言就是:
1.入口函数caffe.cpp main()(调用caffe.cpp train())
2.caffe.cpp train()中 创建solver对象(调用solver.cpp Init())
3.solver.cpp Init()中 solver.cpp InitTrainNet()和InitTestNets()创建训练网络和测试网络
4.运行返回到caffe.cpp train()中,调用solver.cpp Solve()来训练网络,具体训练过程在solver.cpp Step()中实现,迭代直至程序结束
我们都知道要运行一个caffe model的时候需要在命令行下输入:
./build/tools/caffe train -solver xxx.prototxt
然后模型就跑起来了,但是具体程序的入口——main是哪个,执行的顺序是如何的可能不是特别清晰,为了更加理解caffe,在此对其流程做一个具体的分析。
分析方法很简单,细看运行model之后的,输出的Log,比如在此运行lenet model:
./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt
你会得到如下Log:
I0708 09:53:58.417726 3435 caffe.cpp:218] Using GPUs 0 I0708 09:53:58.560006 3435 caffe.cpp:223] GPU 0: TITAN X (Pascal) I0708 09:54:01.458295 3435 solver.cpp:44] Initializing solver from parameters: ... I0708 09:54:01.458588 3435 solver.cpp:87] Creating training net from net file: examples/mnist/lenet_train_test.prototxt I0708 09:54:01.459116 3435 net.cpp:294] The NetState phase (0) differed from the phase (1) specified by a rule in layer mnist I0708 09:54:01.459144 3435 net.cpp:294] The NetState phase (0) differed from the phase (1) specified by a rule in layer accuracy I0708 09:54:01.459230 3435 net.cpp:51] Initializing net from parameters: ... ... ...
观察程序运行的具体哪个.cpp 及哪一行代码,即可理解,因此可得caffe具体运行流程如下:
step1: 命令行下输入./build/tools/caffe train -solver xxx.prototxt 运行了程序的入口caffe.cpp main()
step2: caffe.cpp main()根据命令行输入的参数train 调用caffe.cpp train()
step3: caffe.cpp train()读取xxx.prototxt的参数 调用solver.cpp Solver()的构造函数创建Solver对象
step4: 创建Solver对象的时候需要调用solver.cpp Init()函数来初始化模型的网络
step5: solver.cpp Init()函数调用solver.cpp InitTrainNet()和InitTestNets()函数来分别初始化训练和测试网络。
step6: InitTrainNet() 通过xxx.prototxt 指定的xxxnet.prototxt读取net的参数,调用net.cpp Net()的构造函数,创建训练网络,
step7: net.cpp Net()调用net.cpp Init()函数,通过for循环来1)创建网络中每一个Layer对象,2)设置bottom和top,3)调用layer.cpp Setup()
step8: 调用InitTestNets()创建测试网络,与InitTrainNet()类似
step9: 运行返回到caffe.cpp train()中,利用创建好的solver对象调用solver.cpp Solve()函数
step10: solver.cpp Solve() 调用 solver.cpp Step()函数,while循环迭代的次数,每次迭代 1)调用net.cpp ForwardBackward()来前向以及后向传播 2)solve.cpp ApplyUpdate()更新参数 3)每一定轮次运行solver.cpp TestAll()
step11: 运行结束
可能有点绕,总结而言就是:
1.入口函数caffe.cpp main()(调用caffe.cpp train())
2.caffe.cpp train()中 创建solver对象(调用solver.cpp Init())
3.solver.cpp Init()中 solver.cpp InitTrainNet()和InitTestNets()创建训练网络和测试网络
4.运行返回到caffe.cpp train()中,调用solver.cpp Solve()来训练网络,具体训练过程在solver.cpp Step()中实现,迭代直至程序结束
相关文章推荐
- Caffe之具体运行流程分析
- [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
- quagga 中 rip运行流程具体分析
- spydroid源码分析(二):spydroid运行流程
- NPAPI插件开发详细记录:插件运行流程分析
- 【嵌入式Linux学习七步曲之第四篇 Linux内核移植】PPC Linux启动流程分析
- magento 学习笔记-模块运行流程
- DirectShow 学习(五) CSource类和其一个具体实现例子的源代码分析
- struts1学习之--4、分析和体验struts1程序执行流程
- 韦东山视频学习----内核启动流程分析之配置
- Android应用程序运行过程分析(学习笔记--ITCAST黎活明)
- Linux基础学习之系统引导流程分析
- mfc,示例 ctrlbars 程序运行流程分析
- Hadoop运行流程分析
- Vold工作流程分析学习
- IOS学习笔记1—Iphone程序运行流程
- 内核源码学习:LILO的运行分析
- MonoRail学习笔记四:MonoRail基本流程分析
- Wcf运行时执行流程分析
- android系统启动流程启动画面学习之init和init.rc分析