最近一直在看Caffe C++ 这块的东西,特此整理此份Caffe 学习专栏,所有代码均基于C++实现。本篇博文我们将介绍Blob,并从源码去分析Blob在Caffe中是干什么的,怎么使用它,废话不多说。下面开始介绍Blob。
Blob作为Caffe中用于存储和交换数据的基础数据结构。Blob是一个4维的数组,BIob提供了统一的存储器接口。
Blob在内存中中表示为4维数组,维度从低到高为(width_, height_, channels_, num_),用于存储数据或者权值(data)和权值增量(diff),在进行网络计算的时候,每层的输入、输出都需要通过Blob对象缓冲。
首先我们对Blob进行简短的使用介绍,Blob是包含在头文件 #include<caffe/blob.hpp>中,命名空间是caffe。
Blob是一个模板类,创建对象的时候需要制定模板参数,下面介绍一个简短的测试程序,blob_demo.cpp,代码如下,保存的目录在 /home/wdong/code/caffeLearnning/blob_demo.cpp
#include <vector>
#include <iostream>
#include <caffe/blob.hpp>
using namespace caffe;
using namespace std;
int main(void) {
Blob<float> a;
cout << "Size : " << a.shape_string() << endl;
a.Reshape(1, 2, 3, 4);
cout << "Size : " << a.shape_string() << endl;
return 0;
}
上述代码,首先创建了浮点型Blob对象 a, 并打印对象a的各个维度信息,然后调用其 Reshape() 方法进行维度reshape操作,然后再打印其各个维度的信息。
再终端对上述 blob_demo.cpp 进行编译,首先进入blob_demo.cpp所在目录,我这里将其放在/home/wdong/code/caffeLearning 目录下,编译命令如下:
g++ -o app blob_demo.cpp -I /home/wdong/caffe/include/ -D CPU_ONLY \
> -I /home/wdong/caffe/.build_release/src/ -L /home/wdong/caffe/build/lib/ -lcaffe
执行完该命令,会在 /home/wdong/code/caffeLearning/ 下生成可执行程序 app,执行下面的命令,运行改程序:
export LD_LIBRARY_PATH=/home/wdong/caffe/build/lib/:$LD_LIBRARY_PATH
./app
运行结果,如下图所示:
创建Blob对象之后,我们可以通过mutable_cpu_data() 函数修改内部数值,常见