【原文:http://blog.sina.com.cn/s/blog_eb3aea990102v2oq.html】
以下主要是对于Caffe主页文档的总结
1. 结构的生成:caffe的基本结构是采用google的proto库自动生成的,基本流程就是定义一个配置文件,扩展名为proto,调用proto库的编译器编译这个文件可以生成相应的类的c++的代码。具体的可以参见proto库的介绍。
下面来介绍caffe中用到的一些结构
2.Blob结构:
a. blob是一个标准的Array,主要负责caffe中数据的存储(stores)、关联(communicates)、以及数据的操作(manipulates)。数据在网络结构中要经过正向以及反向转播的过程,在这个过程中要对于数据进行存储、数据之间的通讯、以及数据的操作,blob就是负责这个工作的。
在具体的形式上blob是一个4-D结构的array,是按照(Num,Channels,Height and Width)的顺序存储的,这里的Num相当于minibatch SGD中的batch这样一个概念。此处据作者的解释是应为legacy reason。
b. blob中数据的dimentions为Num N*channel K * Height H * Width W.内存是行优先的(row-major)。访问数据的时候按照如下的规则来访问index(n,k,h,w) 在物理上位于index((n*K + k) *H + h)*W + w. 这里要注意,index(n,k,h,w)实际上访问的是内存中(n+1,k+1,h+1,w+1)位置的数据,这是因为索引是从0开始的。
N是batch size of data,在ImageNet中这个值是256,Channls是feature dimention对于RGB图像来说K = 3. blob的维度是根据layer的type和configuration不同计算不同的,对于一个有96个filter,11*11的spatialdimension,3个input的blob的conv layer来说,其dimention为96*3*11*11,对于一个有1000个ouput channel以及1024个input channnels的 fully-connected
c.blob中的数据访问方法:const方式以及mutable方式,前者访问不能改变数据,后者访问可以改变数据。这种设计主要为了cpu和gpu之间数据的同步,具体的还要深入研究一下。这个有GPU和CPU两个版本。
d.blob中数据分为两个chunks一个是data一个是diff,前者是正常的的传递的数据,后者是网络计算的gradient。
3. Layer结构:
a. Layer是一个核心的结构,它主要定义了基本的计算单元,也就是每一层的具体形式。这个层包括convolve filter、pools、inner products、loss等不同定义
b. 每一个Layer定义了三个核心的计算:
4. Net结构:
a.Net是一个DAG/directed acyclic graph,其节点就是一个个的Layer结构,net从data layer开始,以loss layer结束。
b.通过调用Net::Init()来初始化net,初始化做了两个工作,一个是创建blobs和layers,调用layer::setup(),一个是做一些bookkeeping的事情,比如验证网络结构的有效性,输出一些log等。在net创建后,则根据Caffe::mode()使用cpu或者gpu进行计算。
5. 总结
在caffe里面这几个关键的结构中,blob负责的是数据的存储,Layer负责了数据计算的传输,而net则将前两者又包了一层,net将会扔到slover(关于slover后边再分析)中进行最终的学习。