Caffe使用blob存储、交换、操纵这些信息。blob是整个框架的标准的数组结构和统一存储接口。
Blob是Caffe处理和传输的真实数据的包装类,同时它还隐含提供了在CPU和GPU之间同步数据的能力。在数学上,一个blob就是一个4维的数组,它是按照c语言风格存储的,即行优先。由于我们经常对blob的值和梯度感兴趣,所以blob存储了2块data和diff.前者是正常的传输数据,后者是网络计算的梯度。
在实际中如果使用了GPU,你从磁盘上吧数据读取到CPU模式的内存中的blob里,然后调用GPU的kernel来进行计算,然后把blob数据传给下一层,这一切过程都隐藏了底层的实现细节,并且获得很高的性能。只要所有层都有GPU实现,所有的中间数据和梯度都会保存在GPU中。
caffe中最基础的数据结构是blob,它是一个四维的数组。维度从高到低分别是:(num_,channels_,height_,width_)对于图像数据来说就是:图片个数,彩色通道个数,宽,高,比如说有10张图片,分别是512*256大小,彩色三通道,则为:(10,3,256,512)
blob是一个模板类,现在来看一下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" //里面声明了Blobproto、Blobshape等遵循caffe.proto协议的数据结构
#include "caffe/syncedmem.hpp" //CPU/GPU共享内存类,用于数据同步,很多实际的动作都在这里面执行
*************************************************************************
const int kMaxBlobAxes = 32; //blob的最大维数目
namespace caffe {
template <typename Dtype>
class Blob {
public:
//blob的构造函数,不允许隐式的数据类型转换
Blob(): data_(), diff_(), count_(0), capacity_(0) {}
explicit Blob(const int num, const int channels, const int height,
const int width);
explicit Blob(const vector<int>& shape);
//几个Reshape函数,对blob的维度进行更改
void Reshape(const int num, const int channels, const int height, const in