blob

主要功能:

Blob 是Caffe作为数据传输的媒介,无论是网络权重参数,还是输入数据,都是转化为Blob数据结构来存储,网络,求解器等都是直接与此结构打交道的。

其直观的可以把它看成一个有4纬的结构体(包含数据和梯度),而实际上,它们只是一维的指针而已,其4维结构通过shape属性得以计算出来(根据C语言的数据顺序)。

 

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 layer来说blob的维度为1*1*1000*4096。

 
(@Leo_Shaw指出此处的Num应该是filter的数目,这是我看文档不严谨的地方,非常感谢@Leo_Shaw指出这个问题。上面的解释不完全错,但是只说明了一个方面,此处做一个小的修正:
在caffe文档中指出 blob的dimensions vary according to the type and configuration of the layers,N代表的含义在不同的层中是不一样的,在输入的Data层中,N代表了mini batch size,也就是一次可以处理的图像的数目,在conv层中,N确实代表了filter的数目,这是代码结构定义方面的问题,和算法本身没有关系。

c.blob中的数据访问方法:const方式以及mutable方式,前者访问不能改变数据,后者访问可以改变数据。这种设计主要为了cpu和gpu之间数据的同步,具体的还要深入研究一下。这个有GPU和CPU两个版本。

d.blob中数据分为两个chunks一个是data一个是diff,前者是正常的的传递的数据,后者是网络计算的gradient。
posted @ 2016-01-21 09:40  菜鸡一枚  阅读(728)  评论(0编辑  收藏  举报