caffe模型三种结构
Blob:存储和传递(communication)
blob是数据存储和传输的包装,并且还在底层提供CPU和GPU之间的同步能力。Blob提供了保存数据的统一存储器接口; 例如图像批次,模型参数和用于优化的导数。 在数学上,blob是以C连续方式(C-contiguous fashion)存储的N维数组。
关于C连续方式,stackoverflow有一个解释。该方式主要与Fortran和Matlab相反,是一种以行为主顺序(Row-major order)的存储方式,简单的说就是把一行存完,再存下一行,把第一个通道(channel)的所有行写完后写完再写下一个通道。例如对一批(batches)图像,用4维blob存储,表示为number N(数据批量大小) x channel K(通道、维度特征) x height H (高)x width W(宽),对于索引 (n, k, h, w) 的物理地址就是:((n * K + k) * H + h) * W + w,注意区分大小写,大写是总的,小写是索引值。对于图像是4D的,当然也可以不用4D。具体参数需要根据层类型和数据大小配置。
blob使用了两块存储区域,为data(数据)和diff(网络梯度),实际值可以存储在CPU或GPU上,访问也可以不变(const)访问或者可变(mutable)访问。
const Dtype* cpu_data() const;
Dtype* mutable_cpu_data();
同理可得GPU上diff类型数据操作。官网上有一个example,展示了数据在CPU和GPU上流动操作。
Layer计算和连接
Layer包括很多计算方法,如
- Vision Layers:Convolution、Pooling、LRN
- Loss Layers:Softmax、Sum-of-Squares
既然作为计算,就有输入输出,输入从底部(bottom)获取,并通过顶部(top)连接输出。每层须有三个关键计算:setup, forward, and backward。
- setup:初始化层和连接。
- forward:底部向顶部计算。
- backward:给定梯度,从top计算传回bottom。
A layer with parameters computes the gradient w.r.t. to its parameters and stores it internally.
(是说存在layer中吗)
forward和backward也分为CPU和GPU两个版本。
If you do not implement a GPU version, the layer will fall back to the CPU functions as a backup option. This may come handy if you would like to do quick experiments, although it may come with additional data transfer cost
这里好像是说使用GPU会因为数据需要从CPU复制到GPU上,因此会有数据传输成本,但GPU跑的还是快一些,所以是quick experiments。
Net定义和操作
Net由Layer组成(The net is a set of layers connected in a computation graph
有向无环图)。模型初始化由Net :: Init()处理:主要是创建blob和layer,并调用layer里的setup,同时会输出INFO。
模型格式
模型定义在.prototxt文件中,训练好的模型在model目录下.binaryproto格式的文件中,模型的格式由caffe.proto定义。