Blob是caffe中最基本的数据结构,是caffe的砖石,在本文中我们通过一个实例对Blob进行初步认识,并掌握Blob的基本操作。这个实例的源码blob_demo.cpp,如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 1#include <vector>
2#include <iostream>
3#include <caffe/blob.hpp>
4using namespace caffe;
5using namespace std;
6int main(void)
7{
8 Blob<float> bb;
9 cout<<"Size : "<< bb.shape_string()<<endl;
10 bb.Reshape(2, 2, 3, 3);
11 cout<<"Size : "<< bb.shape_string()<<endl;
12 float * p1 = bb.mutable_cpu_data();
13 float * p2 = bb.mutable_cpu_diff();
14 for(int i = 0; i < bb.count(); i++)
15 {
16 p1[i] = i; // 将 data 初始化为 0,1, 2, 3,……
17 p2[i] = bb.count() - 1 - i; // 将 diff 初始化为 35, 34, 33,……
18 }
19
20 for(int u = 0; u < bb.num(); u++)
21 {
22 for(int v = 0; v < bb.channels(); v++)
23 {
24 for(int w = 0; w < bb.height(); w++)
25 {
26 for(int x = 0; x < bb.width(); x++)
27 {
28 cout<<"bb["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"] = "<< bb.data_at(u, v, w, x)<<endl;
29 }
30 }
31 }
32 }
33
34 cout<<"ASUM = "<<bb.asum_data()<<endl;
35 cout<<"SUMSQ = "<<bb.sumsq_data()<<endl;
36
37
38 bb.Update();// 执行 Update 操作
39
40 for(int u = 0; u < bb.num(); u++)
41 {
42 for(int v = 0; v < bb.channels(); v++)
43 {
44 for(int w = 0; w < bb.height(); w++)
45 {
46 for(int x = 0; x < bb.width(); x++)
47 {
48 cout<<"bb["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"] = "<< bb.data_at(u, v, w, x)<<endl;
49 }
50 }
51 }
52 }
53
54 cout<<"ASUM = "<<bb.asum_data()<<endl;
55 cout<<"SUMSQ = "<<bb.sumsq_data()<<endl;
56
57 return 0;
58}
59
60
在这个程序中,首先实例化了一个Blob对象bb,然后打印bb的尺寸,之后重新定义bb的尺寸,并打印bb的尺寸。重新定义bb的尺寸相当于给bb分配了一部分内存。然后定义float型的指针p1和p2,分别指向bb的数data和偏差diff。
接下来,通过一个for循环,给data和diff赋值,分别为035的值,和350的值。然后将blob的data的值打印出来,之后计算Blob所有元素绝对值之和(L1范数)以及所有元素的平方和(L2范数)。并打印范数的值。
最后调用Blob的Update方法,Update方法用来更新data的值,它实际上是将data与diff加和之后再赋给data。更新完之后再次打印所有元素的值,以及L1和L2范数的值。
通过下面的命令编译代码
1
2 1g++ -o blob_demo blob_demo.cpp -I /home/bigmarshal/Documents/deep_learning/caffe/include/ -D CPU_ONLY -I /home/bigmarshal/Documents/deep_learning/caffe/.build_release/src/ -L /home/bigmarshal/Documents/deep_learning/caffe/build/lib/ -lcaffe -lglog
2
上边命令中的路径需要根据自己电脑的caffe路径进行设置。
在运行程序的可执行文件之前,执行下面的命令。
1
2 1export LD_LIBRARY_PATH=/home/bigmarshal/Documents/deep_learning/caffe/build/lib/:$LD_LIBRARY_PATH
2
这个命令的作用是添加环境变量。
然后用下面的命令运行程序。
1
2 1./blob_demo
2
程序的执行结果如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 1Size : (0)
2Size : 2 2 3 3 (36)
3bb[0][0][0][0] = 0
4bb[0][0][0][1] = 1
5bb[0][0][0][2] = 2
6bb[0][0][1][0] = 3
7bb[0][0][1][1] = 4
8bb[0][0][1][2] = 5
9bb[0][0][2][0] = 6
10bb[0][0][2][1] = 7
11bb[0][0][2][2] = 8
12bb[0][1][0][0] = 9
13bb[0][1][0][1] = 10
14bb[0][1][0][2] = 11
15bb[0][1][1][0] = 12
16bb[0][1][1][1] = 13
17bb[0][1][1][2] = 14
18bb[0][1][2][0] = 15
19bb[0][1][2][1] = 16
20bb[0][1][2][2] = 17
21bb[1][0][0][0] = 18
22bb[1][0][0][1] = 19
23bb[1][0][0][2] = 20
24bb[1][0][1][0] = 21
25bb[1][0][1][1] = 22
26bb[1][0][1][2] = 23
27bb[1][0][2][0] = 24
28bb[1][0][2][1] = 25
29bb[1][0][2][2] = 26
30bb[1][1][0][0] = 27
31bb[1][1][0][1] = 28
32bb[1][1][0][2] = 29
33bb[1][1][1][0] = 30
34bb[1][1][1][1] = 31
35bb[1][1][1][2] = 32
36bb[1][1][2][0] = 33
37bb[1][1][2][1] = 34
38bb[1][1][2][2] = 35
39ASUM = 630
40SUMSQ = 14910
41bb[0][0][0][0] = -35
42bb[0][0][0][1] = -33
43bb[0][0][0][2] = -31
44bb[0][0][1][0] = -29
45bb[0][0][1][1] = -27
46bb[0][0][1][2] = -25
47bb[0][0][2][0] = -23
48bb[0][0][2][1] = -21
49bb[0][0][2][2] = -19
50bb[0][1][0][0] = -17
51bb[0][1][0][1] = -15
52bb[0][1][0][2] = -13
53bb[0][1][1][0] = -11
54bb[0][1][1][1] = -9
55bb[0][1][1][2] = -7
56bb[0][1][2][0] = -5
57bb[0][1][2][1] = -3
58bb[0][1][2][2] = -1
59bb[1][0][0][0] = 1
60bb[1][0][0][1] = 3
61bb[1][0][0][2] = 5
62bb[1][0][1][0] = 7
63bb[1][0][1][1] = 9
64bb[1][0][1][2] = 11
65bb[1][0][2][0] = 13
66bb[1][0][2][1] = 15
67bb[1][0][2][2] = 17
68bb[1][1][0][0] = 19
69bb[1][1][0][1] = 21
70bb[1][1][0][2] = 23
71bb[1][1][1][0] = 25
72bb[1][1][1][1] = 27
73bb[1][1][1][2] = 29
74bb[1][1][2][0] = 31
75bb[1][1][2][1] = 33
76bb[1][1][2][2] = 35
77ASUM = 648
78SUMSQ = 15540
79
80