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之经典模型详解与实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值