如何解读Caffe源码
导读
Caffe是现在非常流行的深度学习库,能够提供高效的深度学习训练。该库是用C++编写,能够使用CUDA调用GPU进行加速。但是caffe内置的工具不一定能够满足用户的所有需求,所以阅读源码并理解它,是很有必要的。
这篇博文不是想把Caffe的所有函数都讲一遍,因为Caffe的源码很大,一本书都不一定能够说清楚。这里我只是说说该怎么去阅读源码,给大家提供一个思路和建议,让大家能够快速把握caffe的整体,出了问题该往哪个方向去思考。
caffe的编译,网上已有很多教程,大家可以看看这篇。
Caffe的文件组织方式
目录 | 功能 |
---|---|
caffe-master | 根目录 |
build | 编译后的存放的目录 |
data | examples使用到的所有数据都放在这里了 |
docs | 这里有很多讲解caffe的文件,新手可以把这里的东西好好看看。.md文件推荐使用atom软件进行查看 |
examples | 这里是放例子的地方,可以借着这些例子好好理解下该怎么用caffe。特别是mnist |
include | 这里存放着caffe的所有头文件。阅读头文件可以让人很快地把握全局而不考虑具体实现 |
matlab | 和 matcaffe有关的文件 |
models | 这里有一些如何写deploy文件的示例,可以用在训练完成后发布你的模型 |
python | 和pycaffe有关的文件都放在这里了。在python中使用caffe时,需要把该路径给加上 |
scripts | 一些帮助使用caffe的脚本 |
src | 头文件的实现都在这里 |
tools | 一些常用的工具的源代码,编译后的可执行文件在build/tools中 |
理解示例
examples里面由好几个caffe的示例,打开mnist看下,里面由很多文件,我们先看readme.md。里面很好的讲解了如何运行这个模型,以及各个参数代表什么意思。读懂了这个的话,基本上你就会运行示例了。其他的示例也可以照这样学习。值得一提的是,学习这个部分时,可以结合docs里面的讲解,还有一些 *.ipynb。如何查看ipynb就不说了,自己查资料。
示例运行得差不多,你就可以琢磨下如何使用deploy文件了。
理解caffe源码
为了更好的阅读代码,我建议按如下步骤使用Eclipse打开caffe工程:
- 配置下java,因为Eclipse需要java环境
- 下载eclipse cpp版
- 打开Eclipse,在菜单栏File->import->c/c++->Existing code as Autotools project,按next,然后在browse中找到caffe-master,进入caffe-master后按确认。
这样就导入了整个工程了,但是不要尝试使用Eclipse来编译caffe,因为基本上都编译不通过。
blob、layer、net、solver这几个是要好好阅读的(头文件以及实现),可以结合这docs里面的文件看。看懂了这几个文件,那么你基本上就大概知道caffe是如何运行的了。
但是你可能在运行示例时很纳闷,每个层那么多的参数,我该怎么知道它是什么意思。别担心,所有的这些信息都可以在src/caffe/proto/caffe.proto中找到。看不懂的话,可以查一下protobuf的使用。
上面的如果都看懂了,那就可以好好研究下src/caffe/layers里面的文件了,把mnist用到的那些层好好看看它是怎么实现的,可以先看cpp,有cuda基础的就看看cu。
添加自己的层
添加自己的caffe层需要有一定的c++基础,至少要明白什么是继承,什么是虚函数,以及多线程的基本概念。可以选择继承一个和自己功能最相近又满足继承关系的层。
具体的步骤可以参考下这篇博文。
使用pycaffe
使用pycaffe的话,我推荐使用cmake而不是直接的make编译工程,因为现在的版本中make后的pycaffe经常出现找不到链接库。
现在是看*.ipynb文件的时候了,里面详细讲解了如何使用caffe的python接口。出现问题的话就看源代码。建议使用pycharm或者Eclipse Java版。