data/用于存放下载的训练数据
docs/帮助文档
examples/代码样例
matlab/Matlab接口文件
python/Python接口文件
models/一些配置好的模型参数
scripts/一些文档和数据会用到的脚本
核心代码
tools/保存的源码时用于生成二进制处理程序,caffe在训练时,实际是直接调用这些二进制文件
include/caffe的实现代码的头文件
src/实现caffe的源文件
src/文件结构
gtest/ google test的用于测试的库
caffe/关键代码:
(1)test/用gtest测试caffe的代码
(2)util/数据转换时用的一些代码,caffe速度快,很大程度得意于内存设计上的优化(blob数据结构采用proto)和对卷积的优化(部分于im2col有关)。还有math_functions定义了caffe中的矩阵计算
(3)proto/即所谓的Protobuf,全称“google protocol buffer”,是一种数据存储格式,帮助caffe提速
(4)layers/深度神经网络中的基本结构就是一层层不相同的网络。这个文件夹下的源文件以及目前位置“src/caffe”中包含的所有.cpp都是caffe和核心目录下的核心代码。
Blob,Layers,Nets是最重要的三个部分
Blob
blob.hpp中的caffe.pb.h是google protocol buffer根据caffe.proto自动生成的。可以在这个里面看到caffe数据的定义,用这种方式定义数据,可以提高数据读写的效率
common.hpp中封装了boost和cuda随机数生成函数,提供了统一的接口。
syncedmem.hpp定义了内存分配和内存释放的接口CaffeMallocHost、CaffeFreeHost。还定义了内存分配管理和CPU、GPU之间的同步函数。
math_functions.hpp封装了很多矩阵运算函数
-----caffe.proto里面的解读
optional意味着可以有一个或者没有这个参数,每个名字后面都有一个数字,这个数字是一个标签,用来在二进制文件中搜索查询。1到15会花费1byte的编码空间,16到2047花费2byte。一般建议把频繁使用的名字标签设置为1到15。后面的repeated意味着float类型的data和diff可以重复任意次数,而加上[packed=true]是为了更高效的编码。
message BlobProto {
optional BlobShape shape = 7;
repeated float data = 5 [packed = true];
repeated float diff = 6 [packed = true];
repeated double double_data = 8 [packed = true];
repeated double double_diff = 9 [packed = true];
// 4D dimensions -- deprecated. Use "shape" instead.
optional int32 num = 1 [default = 0];
optional int32 channels = 2 [default = 0];
optional int32 height = 3 [default = 0];
optional int32 width = 4 [default = 0];
}
-----
blob主要变量:
shared_ptr<SyncedMemory>data_;主要是正向传播时候的数据
shared_ptr<SyncedMemory>diff_;主要用来存储偏差的
blob的常用操作函数
reshape函数在改变blob大小的同事,内存将会被重新分配。
count函数用来统计blob的容量
data_at得到blob的数据
Layer
用于模型和计算的基础
五种类型的层
1、data_layer:
包含与数据有关的文件,支持layertype:data,memory_data,HDF5_data,HDF5_output,image_data
2、neuron_layer:数据的操作层,实现大量的激活函数,元素级别的操作。relu
3、loss_layer:计算网络误差,LossLayer
4、common_layer:连接到vision_layer的。
声明了九个类型的common_layer,
(1)InnerProductLayer常常用来作为全连接层。
(2)SplitLayer用于一输入多输出场合(对blob)
(3)FlattenLayer将n*c*h*w变成n*(c*h*w)*1*1
(4)concatLayer用于多对一输出的场合
(5)SilenceLayer用于一输入多输出的场合(对layer)
(6)Elementwise Operations这里是我们常说的激活函数层ActivationLayers
EltwiseLayer、SoftmaxLayer、ArgMaxLayer、MVNLayer
5、vision_layer实现卷积和pooling操作
convolutionLayer常用的卷积操作
Im2colLayer
LRNLayer
PoolingLayer
Net