转载请注明出处:blog.justkitt.com
背景
A Blob is a wrapper over the actual data being processed and passed along by Caffe, and also under the hood provides synchronization capability between the CPU and the GPU. Mathematically, a blob is an N-dimensional array stored in a C-contiguous fashion.
Caffe stores and communicates data using blobs. Blobs provide a unified memory interface holding data; e.g., batches of images, model parameters, and derivatives for optimization.
Blob是Caffe中用来存放实际数据的结构,一般是一个以C的连续数组存储的N维数组。对于一个4d blob(N,K,H,W)来说,一个(n,k,h,w)的实际地址为:((n*K+k)*H+h)*W+w。Caffe中的所有数据流动都是经由Blob进行封装的。
Blob类不仅存放了前向传播所需要的数据,还存放了反向传播中计算的梯度,用于进行参数的更新。Blob还封装了从CPU和GPU中取数据和同步数据的方式。
写在最前面
在caffe的代码中,对于头文件里声明的类内属性,命名方式都是名字后面会有一道下划线,之后会在特定的地方初始化,这是一种通用的情况。Caffe中不同的元素都在该元素名称下的.hpp和.cpp中实现。
Blob的源码就位于Blob.hpp和Blob.cpp中,在Blob.hpp中会有一些类的定义,例如class Blob{...}
Blob.hpp
在这里就不大段大段贴代码了,从我在网上查资料的情况来看,对于大段大段贴代码然后再在代码里注释的博客,我都很难看下去,所以在我自己的博客中,我需要使用另一种方式去读这样的源码。
我们打开blob.hpp这个文件,就可以看到在文件的开头引入了一些头文件,包括了一些C++标准库中的头文件和Caffe中的一些其他通用的头文件,其中,caffe/proto/caffe.pb.h这个头文件用来处理google protobuf的一些集成,syncedmem.hpp这个头文件是caffe封装的与Cuda相关的一些内存操作。这两个头文件会在之后进行介绍。
blob.hpp中有定义一个const常量const int kMaxBlobAxes = 32blob中最大支持的数据维数是32!
看一个类首先需要做的,就是看这个类的属性,然后再看这个类是怎样用这些属性去做什么事情。在Blob中,有六个属性,分别为:data_, diff_, shape_data_, shape_, count_, capacity_这六个属性的定义和具体的作用如下:
然后再看这些属性是怎么初始化的
在构造函数中,caffe会调用reshape函数进行内存的初始化。同时,reshape函数会在前向传播的时候,重新塑造传送内容的形状。