Caffe中Blob细解
2017-05-02 15:41
337 查看
Blob数据结构介绍
Blob提供了统一的存储器接口,TensorFlow中的Tensor也有对应的Blob数据结构。
Caffe的基本存储单元是Blob,使用Blob格式的4维数组用于存储和交换数据,维度从低到高为(width_,height_,channels_,num_),用于存储数据或权值(data)和权值增量(diff),其中width_和height_分别表示图像的宽和高,channels_表示颜色通道RGB,num_表示第几个颜色通道。在进行网络计算时,每层的输出/输入都需要通过Blob对象缓冲。
Blob数据结构描述
src/caffe/proto/caffe.proto文件中,Blob描述如下:
函数介绍
Dtype data_at(const int n, const int c, const int h,const int w) const:通过n,c,h,w 4个参数来来获取该向量位置上的值。
Dtype diff_at(const int n, const int c, const int h,const int w) const
Dtype asum_data() const:绝对值之和,即L1-范式
Dtype asum_diff() const
Dtype sumsq_data() const:平方和,即L2-范式
Dtype sumsq_diff() const
void scale_data(Dtype scale_factor):data乘以一个标量
void scale_diff(Dtype scale_factor)
void ShareData(const Blob& other):共享一个Blob的data
void ShareDiff(const Blob& other)
const Dtype* cpu_data() const:只读CPU上的数据
const Dtype* gpu_data() const
void set_cpu_data(Dtype* data):设置CPU上的数据
const Dtype* cpu_diff() const:只读CPU上的偏差
const Dtype* gpu_diff() const
Dtype* mutable_cpu_data():读写cpu上的数据
Dtype* mutable_gpu_data()
Dtype* mutable_cpu_diff():读写CPU上计算偏差
Dtype* mutable_gpu_diff()
void Update():更新变量值,使数据同步。
void FromProto(const BlobProto& proto, bool reshape=true):反序列化函数,从BlobProto中恢复一个Blob对象
void ToProto(BlobProto* proto, bool write_diff=false) const:序列化函数,将内存中的Blob对象保存到BlobProto中
ToProto()和FromProto()可将Blob内部值保存到磁盘中或者从磁盘中载入到内存。
使用ProtoBuffer而不使用结构体的原因:
1)结构体的序列化/反序列化操作需要额外的编程实现,难以做到结构标准化;2)结构体中包含变长数据(一般用指向某个内存地址的指针)时,需要更加细致的工作保证数据的完整性。
ProtoBuffer将编程最容易出现问题的地方加以隐藏,让机器自动处理,提高了程序的健壮性。
Blob模板类
在include/caffe/blob.hpp中申明了Blob模板类,并封装了SyncedMemory类,const int kMaxBlobAxes = 32定义了Blob最大维数目。
//状态机变量:未初始化、CPU数据有效、GPU数据有效、已同步
enum SyncedHead {UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED}
Blob提供了统一的存储器接口,TensorFlow中的Tensor也有对应的Blob数据结构。
Caffe的基本存储单元是Blob,使用Blob格式的4维数组用于存储和交换数据,维度从低到高为(width_,height_,channels_,num_),用于存储数据或权值(data)和权值增量(diff),其中width_和height_分别表示图像的宽和高,channels_表示颜色通道RGB,num_表示第几个颜色通道。在进行网络计算时,每层的输出/输入都需要通过Blob对象缓冲。
//使用的是一个Blob的容器是因为某些Layer包含多组学习参数 vector<shared_ptr<Blob<Dtype>>> blobs_;
Blob数据结构描述
src/caffe/proto/caffe.proto文件中,Blob描述如下:
// packed表示这些值在内存中紧密排布,没有空洞 message BlobShape{ //只包括若干int64类型值,分别表示Blob每个维度的大小 repeated int64 dim = 1 [packed = true]; } message BlobProto{ //包含一个BlobShape对象 optional BlobShape shape = 7; //包含若干浮点元素,存储数据或者权值,元素数目由shape或者(num, channels, height, width)确定 repeated float data = 5 [packed = true]; //包含若干浮点元素,存储增量信息,维度与data数组一致 repeated float diff = 6 [packed = true]; //与data类似,类型为double repeated double double_data = 7 [packed = true]; //与diff类似,类型为double repeated double double_diff = 8 [packed = true]; //维度信息可选值,新版Caffe推荐使用shape,而不用后面的值 optional int32 num = 1 [default = 0]; optional int32 channels = 2 [default = 0]; optional int32 height = 3 [default = 0]; optional int32 width = 4 [default = 0]; }
函数介绍
Dtype data_at(const int n, const int c, const int h,const int w) const:通过n,c,h,w 4个参数来来获取该向量位置上的值。
Dtype diff_at(const int n, const int c, const int h,const int w) const
Dtype asum_data() const:绝对值之和,即L1-范式
Dtype asum_diff() const
Dtype sumsq_data() const:平方和,即L2-范式
Dtype sumsq_diff() const
void scale_data(Dtype scale_factor):data乘以一个标量
void scale_diff(Dtype scale_factor)
void ShareData(const Blob& other):共享一个Blob的data
void ShareDiff(const Blob& other)
const Dtype* cpu_data() const:只读CPU上的数据
const Dtype* gpu_data() const
void set_cpu_data(Dtype* data):设置CPU上的数据
const Dtype* cpu_diff() const:只读CPU上的偏差
const Dtype* gpu_diff() const
Dtype* mutable_cpu_data():读写cpu上的数据
Dtype* mutable_gpu_data()
Dtype* mutable_cpu_diff():读写CPU上计算偏差
Dtype* mutable_gpu_diff()
void Update():更新变量值,使数据同步。
void FromProto(const BlobProto& proto, bool reshape=true):反序列化函数,从BlobProto中恢复一个Blob对象
void ToProto(BlobProto* proto, bool write_diff=false) const:序列化函数,将内存中的Blob对象保存到BlobProto中
ToProto()和FromProto()可将Blob内部值保存到磁盘中或者从磁盘中载入到内存。
使用ProtoBuffer而不使用结构体的原因:
1)结构体的序列化/反序列化操作需要额外的编程实现,难以做到结构标准化;2)结构体中包含变长数据(一般用指向某个内存地址的指针)时,需要更加细致的工作保证数据的完整性。
ProtoBuffer将编程最容易出现问题的地方加以隐藏,让机器自动处理,提高了程序的健壮性。
Blob模板类
在include/caffe/blob.hpp中申明了Blob模板类,并封装了SyncedMemory类,const int kMaxBlobAxes = 32定义了Blob最大维数目。
//状态机变量:未初始化、CPU数据有效、GPU数据有效、已同步
enum SyncedHead {UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED}
相关文章推荐
- caffe入门教程1——Caffe代码层次:Blob、Layer、Net、Solver
- 【caffe】基本数据结构blob说明,用faster-rcnn 之 RPN网络的结构解析进行说明
- 21天实战caff--2 第8天 Caffe数据结构-Blob基本用法
- caffe的学习之路---Blob的基本用法
- Caffe源码解析1:Blob
- Caffe学习2:Blob
- 【Caffe代码解析】Blob
- 关于caffe中的blob结构及卷积计算汇总
- caffe源码追踪--blob
- Caffe Blob Dtype理解
- caffe基本数据结构---blob
- Caffe-代码解析-Blob
- caffe系列之:Blob,Layer and Net以及对应配置文件的编写
- caffe代码阅读1:blob的实现细节-2016.3.14
- Caffe中的数据容器Blob
- caffe源码解析之blob.hpp或blob.cpp
- (Caffe)基本类Blob,Layer,Net(一)
- caffe源码剖析之Blob
- caffe基本数据结构---blob
- Caffe源码解析1:Blob