深度学习caffe数据结构(四)—— blob数据结构blob.hpp详细解读

        blob是caffe中的基本数据结构,它声明在blob.hpp中,这个文件位于caffe根目录的include/caffe/路径下,在这篇文章中,我们对blob.hpp文件进行详细解读,以便对blob数据结构有深刻的认识。

#ifndef CAFFE_BLOB_HPP_
#define CAFFE_BLOB_HPP_

#include <algorithm>
#include <string>
#include <vector>

#include "caffe/common.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/syncedmem.hpp"

        这几行代码是blob.hpp文件的开头,主要是该文件包含的头文件。

const int kMaxBlobAxes = 32;

这一行定义了一个int型变量,它表示的是blob的最大维数,老版本的caffe包含的维数是num、channels、height、width共四个维度,新版本的caffe最多可以支持32个维度。

namespace caffe {

这一行定义caffe命名空间

template <typename Dtype>

这一行表明这个类是末班类,Dtype为类型名,在c++中,通过这种方法可以实现多种数据类型的处理,比如Dtype可以float、double等。

class Blob {
 public:
  Blob()
       : data_(), diff_(), count_(0), capacity_(0) {}

这几行定义了Blob类,并声明了Blob的默认构造函数。

  explicit Blob(const int num, const int channels, const int height, const int width);
  explicit Blob(const vector<int>& shape);

这两行声明了两个Blob的显式构造函数,分别采用两种不同的数据类型来构造Blob类,第一个函数是使用num、channels、height、width这四个维度信息来构造Blob类,它是用来兼容老版本caffe的,第二个函数是使用int型的向量shape来构造Blob, shape最大维度为32。

  void Reshape(const int num, const int channels, const int height, const int width);

这一行定义了一个变形函数,它的作用是通过num、channels、height、width这四个维度信息来改变原有的Blob的形状,这个函数主要是用来兼容老版本caffe的。

  void Reshape(const vector<int>& shape);

这一行定义了另一个变形函数,它是通过shape向量来改变Blob的形状。

  void Reshape(const BlobShape& shape);

这一行定义的变形函数是根据Blob描述文件中的形状信息来变形的函数。

  void ReshapeLike(const Blob& other);

这一行依然是一个变形函数,它把本类的形状变成与other类形状相同。

  inline string shape_string() const {
    ostringstream stream;
    for (int i = 0; i < shape_.size(); ++i) {
      stream << shape_[i] << " ";
    }
    stream << "(" << count_ << ")";
    return stream.str();
  }

上面定义的是一个函数,它的作用是将Blob的形状信息变成字符串并返回。在函数中首先定义了一个流输出变量stream,然后在for循环中,把shape_的每一个维度转换为字符串挂接在stream后边,最后把元素数目count_挂接在stream后边,形成一个字符串输出。其中,shape_和count_是Blob了的成员变量,shape_是表示Blob形状的向量,count_是表示Blob元素数量的int型变量。caffe中成员变量是以下划线结尾的,比较号区分。

  inline const vector<int>& shape() const { return shape_; }

这一行定义的是读取Blob形状的的函数,直接返回成员变量shape_。

  inline int shape(int index) const {
    return shape_[CanonicalAxisIndex(index)];
  }

这一行定义的函数是读取某一个维度上的尺寸,在函数中调用了CanonicalAxisIndex()函数,它的作用是确认维度数index是否可用,在下面有详细定义。

发布了97 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104549698
今日推荐