caffe源码分析-Blob

本文主要分析caffe源码分析-Blob,主要如下几个方面:

  1. overview整体上了解caffe的Blob

  2. Blob 成员变量

  3. Blob主要函数,核心在于Blob的使用实例以及其与opencv Mat的操作的相互转化(附带运行结果基于CLion)

overview

BlobCaffe作为数据传输的媒介,无论是网络权重参数,还是输入数据,都是转化为Blob数据结构来存储,网络,求解器等都是直接与此结构打交道的。

其直观的可以把它看成一个有4维的结构体(包含数据和梯度),而实际上,它们只是一维的指针而已,其4维结构通过shape属性得以计算出来(根据C语言的数据顺序)。

Blob在也不一定全是4维的,例如全连接层的参数就没有用四维,后期的版本已经deprecated,而是直接用vector<int> shape_


成员变量

Blob中的主要数据成员如下,实际是在SyncedMemory上做了一层包装(SyncedMemory介绍见上一篇blog):

protected:
    shared_ptr<SyncedMemory> data_; //存储前向传递数据
    shared_ptr<SyncedMemory> diff_; //存储反向传递梯度
    shared_ptr<SyncedMemory> shape_data_;// 参数维度old version
    vector<int> shape_;  //参数维度
    int count_; //Blob存储的元素个数(shape_所有元素乘积)
    int capacity_;//当前Blob的元素个数(控制动态分配)

主要函数

主要分析如下几类函数:

  1. 构造函数, 以及Reshape函数()

  2. 索引、返回N、C、H、W相关函数

  3. gpu、cpu同步函数, 以及数据的获取

  4. 简单的数据处理如scale_data对数据缩放(底层调用了cblas库的运算)

  5. Blob的示例,数据赋值以及和opencv Mat的操作

  6. Blob对应的protobuf结构体BlobShape、BlobProto、BlobProtoVector

1. 构造函数, 以及Reshape函数()

构造函数分类两种类型:

  1. 默认的什么参数

  2. 传入N、C、H、W构造,最终调用Reshape函数

Blob() //构造函数:初始化列表 {空函数体}
            : data_(), diff_(), count_(0), capacity_(0) {}

// @brief Deprecated; use <code>Blob(const vector<int>& shape)</code>.
explicit Blob(const int num, const int channels, const int height,
              const int width);   //可以通过设置数据维度(N,C,H,W)初始化
// 也可以通过传入vector<int>直接传入维数
explicit Blob(const vector<int>& shape);

Blob() //构造函数:初始化列表 {空函数体}
            : data_(), diff_(), count_(0), capacity_(0) {}

// @brief Deprecated; use <code>Blob(const vector<int>& shape)</code>.
explicit Blob(const int num, const int channels, const int height,
              const int width);   //可以通过设置数据维度(N,C,H,W)初始化
// 也可以通过传入vector<int>直接传入维数
explicit Blob(const vector<int>& shape);

下面重点看下Reshape函数

template <typename Dtype>
void Blob<Dtype>::Reshape(const int num, const int channels, const int height,
                          const int width) {
    vector<int> shape(4);
    shape[0] = num;
    shape[1] = channels;
    shape[2] = height;
    shape[3] = width;
    Reshape(shape);
}

// 完成blob形状shape_的记录,大小count_的计算,合适大小capacity_存储的申请
template <typename Dtype>
void Blob<Dtype>::Reshape(const vector<int>& shape) {
    CHECK_LE(shape.size(), kMaxBlobAxes);
    count_ = 1;
    shape_.resize(shape.size());

    if (!shape_data_ || shape_data_->size() < shape.size() * sizeof(int)) {
        shape_data_.reset(new SyncedMemory(shape.size() * sizeof(int)));
    }
    int* shape_data = static_cast<int*>(shape_data_->mutable_cpu_data());
    for (int i = 0; i < shape.size(); ++i) {
        CHECK_GE(shape[i], 0);
        CHECK_LE(shape[i], INT_MAX / count_) << "blob size exceeds INT_MAX";
        count_ *= shape[i];
        shape_[i] =
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值