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是否可用,在下面有详细定义。