个人学习一个东西比较喜欢站在一个全局的角度先了解学习下,培养大局观这样有助于更好的思考整个事情。下面就来先看看Caffe的目录框架(在命令行输入tree -d,可以看到类似如下的结果,有删改,只保留了要重点关注的部分):
.
├── build -> .build_release // 编译结果存放处,目录结构和主目录差不多
├── include // 头文件存放目录
│ └── caffe
│ ├── layers
│ ├── test
│ └── util
├── python // Python封装,还有一些好用的工具,如画网络结构图的draw_net.py
│ └── caffe
│ ├── imagenet
│ ├── proto
│ └── test
├── src // Caffe源代码
│ ├── caffe
│ │ ├── layers // 各个层的具体实现,包含.cu, .cpp文件
│ │ ├── proto
│ │ ├── solvers
│ │ ├── test
│ │ │ └── test_data
│ │ └── util
│ └── gtest
└── tools // 常用工具源代码,train_net, test_net
└── extra
Caffe源码阅读顺序:
- 阅读src/caffe/proto/caffe.proto文件,了解常用的数据结构,以及Caffe是如何对磁盘读写的,实际上,读写操作由ProtoBuffer自动完成
- 阅读include目录下的头文件声明,了解类构造,先从基类开始,提纲挈领,同时尝试思考如何实现的。
- 看src目录下的.cpp, .cu文件。先看.cpp文件,.cu是GPU代码,可以看懂.cpp之后再看。如果要进行拓展,实现新的layer,只需派生原有layer即可
- 随意玩~可以尝试编写各类工具,集成到tools/目录下,方便使用。
为了在文件中查找某一字段,可以使用Linux文本搜索命令grep:
$ grep -n -H -R “REGISTER_LAYER_CREATOR” *
-n :显示行号
-H:显示文件名
-R:递归查找
所以上面表示,递归查找包含”REGISTER_LAYER_CREATOR”字符串的文件,并显示其行号,文件名
参考资料: