caffe框架中,数据结构主要包括:Blob、Layer、Net、Solver。caffe的所有数据结构都在caffe根目录下的src/caffe/proto/caffe.proto文件中进行了描述。
首先,Blob是caffe中基本的数据结构,如果把caffe比作一栋大楼,那么Blob就是每一块砖。通过Blob这些砖构建成一层一层的楼层Layer,每一层合在一起就构成了大楼Net。prototxt用来描述网络和求解器,它可以看做是大楼的图纸,而Solver则可以看做是大楼的建筑工艺。
1、Blob
Blob是caffe的基本数据结构,它在内存中表示4维数组,维度由高到低为(num、channels、height、width)。这四个维度可以这样理解,它们用来描述一组图像,num可以理解为图像的个数,channels可以理解为颜色通道,比如RGB的每个通道,height和width则可以理解为图像的高和宽。Blob存储了包括神经元的激活值、参数、以及相应的梯度。在进行网络计算时,每层的输入输出都是需要通过Blob对象缓冲。
2、Layer
代表神经网络的层,由各种各样的层来构成整个网络。一般一个图像或样本会从数据层中读进来,然后一层一层的往后传。所以每个Layer至少有一个输入Blob和一个输出Blob,部分Layer带有权值和偏置项,有两个运算方向:前向传播和反向传播,其中前向传播计算会对输入Blob进行某种处理(有权值和偏置项的Layer会利用这些对输入进行处理),得到输出Blob;而反向传播计算则对输出Blob的diff进行某种处理,得到输入Blob的diff(有权值和偏置项的Layer会计算权值Blob、偏置项Blob的diff)。
3、Net
Net在caffe中代表一个完整的CNN模型,它包含若干Layer实例。它相当于一张图纸,在caffe中通过.prototxt文件进行描述。通过对.prototxt文件的研究,发现Net就是若干Layer的集合体。
4、Slover
Solver是按solver.prototxt的参数定义对Net进行训练,首先会初始化一个TrainNet和一个TestNet,然后其中的Step函数会对网络不断进行迭代,主要就是两个步骤反复迭代:(1)不断利用ComputeUpdateValue计算迭代相关参数。(2)调用Net的Update函数对整个网络进行更新。迭代中的训练日志中的大部分输出也是在这里输出的。
本文只对caffe的数据结构进行简单介绍,在接下来的文章中,我们将会对caffe数据结构进行代码级的详细介绍,逐层揭开caffe的神秘面纱。