Caffe源码解读之从目录说起(一)

机器学习 2017-01-14

  Caffe是一个十分成熟的深度学习框架,使用它也有一段时间了,一直停留在参数配置和模型使用上,接下来将以庖丁解牛的方式从源码和运行原理角度解析Caffe。

  Clone它的源码之后不妨看看Caffe的目录。其中,data/ 用于存放下载的训练数据,docs/ 帮助文档,examples/ 代码样例,matlab/ MATLAB接口文件,models/ 一些配置好的模型参数,scripts/ 一些文档和数据会用到的脚本,/src 是核心代码,src底下.cu文件是GPU模式会用到的,tools/ 保存的源码是用于生成二进制处理程序的,caffe在训练时实际是直接调用这些二进制文件,include/ Caffe的实现代码的头文件。   不妨再看看/src下的目录。gtest/ 是google test一个用于测试的库你,make runtest时看见的很多绿色RUN OK就是它。/src/caffe/test 下是用gtest测试caffe的代码。/src/caffe/util/ 数据转换时用的一些代码。caffe速度快,很大程度得益于内存设计上的优化(blob数据结构采用proto)和对卷积的优化。/src/caffe/proto/ 即所谓的“Protobuf”,全称“Google Protocol Buffer”,是一种数据存储格式,帮助caffe提速。/src/caffe/layers/ 深度神经网络中的基本结构就是一层层互不相同的网络了。   其中Blob,Layer,Net是最基本的三种结构,也是理解源码的重点。其中Blob用于数据的保存、交换和操作,Caffe基础存储结构,Layer用于模型和计算的基础,Net用于整合连接Layers。

  我们在编译caffe之前安装了一些依赖也需要知道其用途。protobuf前文说过了是google的一种数据交换的格式,性能好,效率高。caffe使用两种数据库,Leveldb是一个google实现的非常高效的kv数据库,lmdb同样是谷歌的非关系型数据库,效率较前者更高,因此成为Caffe的默认数据格式。glog是google的C++开源日志库。gflags是google的一个开源的处理命令行参数的库。OpenCV用于对原始图片进行裁剪等操作。Snappy是一个 C++ 的用来压缩和解压缩的开发包。而hdf5是可以存储不同类型的图像和数码数据的文件格式,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。由于Caffe是C++开发的,所以Boost库也不可少。至于ATLAS,OpenBLAS,MKL这三种可选的核心数学库效率略有不同,付费的Intel的MKL效率最高。   可见Caffe的速度和高效是有原因的,即利用了许多优秀的开源库。


本文由 Tony 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!