caffe使用gdb单步调试及源码阅读

本文主要是介绍我在阅读caffe过程中参考的顺序以及网站。


首先阅读caffe看了知乎上面的这篇文章 深度学习caffe的代码怎么读?参考的是Gein Chen大神的回答:

1.先让程序跑起来,看看结果,这样就会有直观的感受。

2.单步调试,跟着Caffe在网络里流动。

3.个性化定制Caffe。

4.理解并实现Backpropagation。


本文主要是进行了简单的单步调试,并跟着网络的结构看了网络的init() forward()以及backward()的过程。现在将我看的大概过程给大家分享。


一.caffe单步调试

1.config文件中将debug设置为1。
2.重新编译caffe。
3.使用gdb —arg  例如:   gdb --args ./build/tools/caffe.bin train  --solver=examples/mnist/lenet_solver.prototxt
4.在caffe.cpp(caffe的入口函数)中设置断点
5.gdb - r 让程序run起来
注:gdb不熟悉可以需先补充相关知识

二.Caffe入口函数

1.caffe 入口函数参考:caffe.cpp 程序入口分析
这篇文章从caffe的main函数出发,介绍了caffe一步一步如何向下执行,同时这篇文章还科普了typedef、#define 宏定义等等基础知识,非常适合初学者阅读。
2.caffe 训练网络参考: (Caffe,LeNet)训练网络入口
这篇文章讲了如何将solver参数读入进去,solver如何创建、Solver::Solve()函数以及如何调用到sgdSolver()上以及Solver::Step()函数等等,非常适合看完上篇main函数之后,在接着看caffe.cpp中的train函数。

三.初始化训练网络

初始化训练网络的文章参考文章:初始化训练网络
这篇文章讲了如何将net的参数读入到网络,网络的整体结构、网络的数据层、卷积层、pooling层、全连接层 softmax等等的初始化,以及每一个层blob的结构是什么样进行了介绍。
关于测试网络的初始化也可以参考:测试网络的初始化

四、前向传播

前向传播的文章可以参考文章:(Caffe,LeNet)前向计算
这篇文章主要剖析Caffe中Net::Forward()函数,即前向计算过程。
这里主要说一下卷积层的实现,其他层的实现相对较简单。
卷几层的实现可以参考caffe作者贾杨清关于卷几层的说明:caffe卷几层是如何实现
说明了为何使用im2col的方法来实现卷积,虽然比较占内存。这里im2col的方法需要花时间去理解。

五、反向传播

反向传播的文章可以参考:caffe反向传导算法
这篇文章虽然只是以全连接层以及softmax层为例介绍了caffe反向传播是如何完成,这篇文章包含了公式推导以及那些实现是如何与公式完美结合。
个人建议是阅读反向传播之前将反向传播自己推导一遍,然后对着源代码看,这样对代码的理解会更加深刻与清晰。











展开阅读全文

没有更多推荐了,返回首页