caffe源码导读(二)关于Blob数据结构

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/hjxu2016/article/details/84565476

打开proto/caffe.proto中,刚开始就是介绍Blob数据结构,这个数据结构是其他大部分数据结构的重要依赖.

caffe中进行网络层计算时,每一层的输入输出都是以Blob对象为缓冲,是cagge的基本存储单元.

一、先看Blob的数据结构描述

// Specifies the shape (dimensions) of a Blob.
message BlobShape {
//来实现高维度的封装,既vector<N>,分别表示Blob每个维度的大小;packed表示这些值在内存中紧密排布
  repeated int64 dim = 1 [packed = true];
}

message BlobProto {
  optional BlobShape shape = 7; //可选,包含一个blobshape对象
  repeated float data = 5 [packed = true];
  // 包含若干浮点数元素,存储数据和权值,元素数目有shape或(num, channels, height, width)确定,在内存中紧密排布
  repeated float diff = 6 [packed = true]; // 浮点数,用来存储增量信息
  repeated double double_data = 8 [packed = true];
  repeated double double_diff = 9 [packed = true];

  // 4D dimensions -- deprecated.  Use "shape" instead.
  // 数据4D形状,已经使用shape代替了,意思就是新版本推荐使用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];
}

// The BlobProtoVector is simply a way to pass multiple blobproto instances
// around.
message BlobProtoVector {
  repeated BlobProto blobs = 1;//多个 BlobProto
}

使用protobuf数据结构而不用结构体是因为

1)结构体的序列化和反序列化需要额外的编程实现,难以做到借口标准化

2)结构体中包含很长的数据(一般指向某个内存的指针),需要更加细致的工作保证数据结构的完整性

3)protobuffer可以将编程更容易出问题的地方加以隐藏,让机器自动处理,提高程序的健壮性.

猜你喜欢

转载自blog.csdn.net/hjxu2016/article/details/84565476