caffe学习(1)caffe模型三种结构


caffe模型三种结构



自己写的然而CSDN出bug了,绑定三方账户原来的博客无法编辑,只好转发过来


Blobs, Layers, and Nets: anatomy of a Caffe model







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定义。