Caffe Blob

Caffe Blob

Caffe使用Blob结构来存储、交换和处理网络中正向和反向迭代的数据和导数信息。Blob是Caffe的标注数组结构,提供了Caffe的统一内存接口。

Blob是Caffe中处理和传递实际数据的数据封装包,并且在CPU与GPU之间具有同步处理能力。Blob还可以根据CPU主机到GPU设备的同步需要,屏蔽CPU/GPU混合运算在计算上的开销。主机和设备上的内存按需求分配,以提高内存的使用效率。

一般对批量图像数据,Blob的维度为图像数量N×通道数K×图像高度H×图像宽度W。Blob按行为主存储,四维Blob中,坐标为(n, k, h, w)的值的物理位置为((n×K+k)×H+h)×W+w。例如在96个空间的卷积层维度为11×11,输入为3通道的滤波器,则Blob的维度为96×3×11×11。若一个全连接层(内积层)的输入和输出分别是1024维和1000维,则参数Blob的维度等于1000×1024。

虽然Caffe在图像应用中Blob都是四维坐标,对于非图像应用也完全可以正常使用。

Blob的实现细节。由于Blob中最重要的是values和gradients两类数据,所以blobs存储单元对应data和diff两个数据节点,前者是网络中传递的普通数据,后者是通过网络计算得到的梯度。

Blob数据既可以存储在CPU上,也可以存储在GPU上,因此有两种数据访问方法:静态不改变数值方法和动态改变数值方式。

Const Dtype* cpu_data() const;
Dtype* mutable_cpu_data();

Blob使用SyncedMem类同步CPU与GPU上的数值,隐藏同步细节。实际上,使用GPU时,Caffe中CPU代码先从磁盘中加载数据到blobs,同时请求分配一个GPU设备核(device kernel)进行GPU计算,再将计算好的blobs数据送入层,这样实现了高校运算,又忽略了底层细节。只要所有layers均有GPU实现,这种情况所有的中间数据和梯度都会保留在GPU上。

如下时Blob复制数据的一个示例:

Const Dtype* foo;
Dtype* bar;
foo = blob.gpu_data(); // 数据从CPU复制到GPU
foo = blob.cpu_data(); //没有数据复制,两者都是最新数据
bar = blob.mutable_gpu_data(); //没有数据复制
// ...其他操作...
bar = blob.mutable_gpu_data(); // 仍在GPU,没有数据复制
foo = blob.cpu_data(); // 由于GPU修改了数值解,数据从GPU复制到CPU
foo = bolb.gpu_data(); // 没有数据复制,两者都有最新的内容
bar = blob.mutable_cpu_data(); // 依旧没有数据复制
bar = blob.mutable_gpu_data(); // 数据从CPU复制到GPU
bar = bolb.mutable_cpu_data(); // 数据从GPU复制到CPU

参考:《深度学习——Caffe之经典模型详解与实战》

猜你喜欢

转载自blog.csdn.net/juluwangriyue/article/details/115099793