caffe源码分析:blob.hpp分析

来源:互联网 发布:网络安全工程师学习 编辑:程序博客网 时间:2024/05/18 01:48

文件路径:caffe-master_github/include/caffe/
如果想对blob有详细了解,参考Caffe官网教程:http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html


以下摘自互联网:
Blob作为Caffe的四大模块之一,负责完成CPU/GPU存储申请、同步和数据持久化映射。Caffe内部数据存储和通讯都是通过Blob来完成,Blob提供统一的存储操作接口,可用来保存训练数据、模型参数等。Blob是一个高维连续数组,批处理图像数据时通常使用4维Blob,Blob的维度可以表示为(N, K, H, W),每个维度的意思分别是:

  • N: 数据的个数,例如SGD时一次mini-batch的图像个数。
  • K: 如果是图像,可以理解为通道数量;如果是网络中间结果,就是feature map的数量。
  • H, W: 如果是图像数据,可以理解为图像的高度和宽度;如果是参数数据,可以理解为滤波核的高度和宽度。

Caffe中通常只使用4维Blob完成图像应用,但是Blob完全可以合理地被用来存储任何数据,比如说学习到的参数。
例如:

  • 1000幅640*480 RGBD图像数据,其Blob形状为(1000, 4, 480, 640)。
  • 96个大小11*11的滤波核,处理16通道的输入数据,其参数Blob的形状为(96,16,11,11)。
  • 1000个输出,1024个输入的全连接层,其参数Blob的形状为(1000,1024)。

blob.hpp:
数据成员:

protectedshared_ptr<SyncedMemory> data_; //存放数据 shared_ptr<SyncedMemory> diff_; //存放梯度shared_ptr<SyncedMemory> shape_data_; vector<int> shape_;//shape_是Blob维度参数 int count_;//count表示Blob存储的元素个数(shape_所有元素乘积) int capacity_;//capacity_表示当前Blob的元素个数(控制动态分配)

构造函数:
默认构造函数完成最基本的初始化,两个显示构造函数会调用Reshape函数完成data_和diff_的共享内存对象SyncedMemory的申请。

const Dtype* cpu_data() const; //cpu使用的数据void set_cpu_data(Dtype* data); //用数据块的值来blob里面的dataconst int* gpu_shape() const;const Dtype* gpu_data() const; //返回不可更改的指针,下同const Dtype* cpu_diff() const;const Dtype* gpu_diff() const;Dtype* mutable_cpu_data(); //返回可更改的指针,下同Dtype* mutable_gpu_data();Dtype* mutable_cpu_diff();Dtype* mutable_gpu_diff();

总之,带mutable_开头的意味着可以对返回的指针内容进行更改,而不带mutable_开头的返回const 指针,不能对其指针的内容进行修改
Reshape函数:

void Reshape(const vector<int>& shape);//主要完成数据成员shape_,shape_data_,count_,capacity_,data_,diff_最基本的初始化工作,主要包括内存分配,含初始化。void Reshape(const BlobShape& shape);//特别是完成data_,diff_的共享内存对象SyncedMemory的申请。
0 0
原创粉丝点击