caffe源碼分析–Blob應用
本文主要介紹如何利用blob函數進行驗證測試,加深理解,Blob代碼分析可參考Caffe源碼分析–Blob代碼分析
首先編譯好caffe,新建blob_demo.cpp文件,代碼如下,參考書籍《深度學習 21天實戰Caffe》
#include<vector>
#include<iostream>
#include<caffe/blob.hpp>
#include<caffe/util/io.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;
float * p = a.mutable_cpu_data();
float * q = a.mutable_cpu_diff();
for(int i=0;i<a.count();i++)
{
p[i]=i;
q[i]=a.count()-1-i;
}
a.Update(); //執行updata操作,data=data-diff
for(int u=0;u<a.num();u++)
{
for(int v=0;v<a.channels();v++)
{
for(int w=0;w<a.height();w++)
{
for(int x=0;x<a.width();x++)
{
cout<<"a["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"]="<<a.data_at(u,v,w,x)<<endl;
cout<<"q["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"]="<<a.diff_at(u,v,w,x)<<endl;
}
}
}
}
cout<<"ASUM="<<a.asum_data()<<endl; // 計算所有元素絕對值之和(L1-範數)平方和(L2範數)
cout<<"SUMSQ="<<a.sumsq_data()<<endl;
BlobProto bp; //構造一個BlobProto對象
a.ToProto(&bp,true); //將a序列化,連同diff(默認不帶)
WriteProtoToBinaryFile(bp,"a.blob"); //寫入磁盤文件“a.blob”
BlobProto bp2; //構造一個新的BlobProto對象
ReadProtoFromBinaryFileOrDie("a.blob",&bp2); //讀取磁盤文件
Blob<float> b; //新建一個Blob對象b
b.FromProto(bp2,true); //從序列化對象bp2中克隆b(連同形狀)
for(int u=0;u<b.num();u++)
{
for(int v=0;v<b.channels();v++)
{
for(int w=0;w<b.height();w++)
{
for(int x=0;x<b.width();x++)
{
cout<<"b["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"]="<<b.data_at(u,v,w,x)<<endl;
cout<<"b_diff["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"]="<<b.diff_at(u,v,w,x)<<endl;
}
}
}
}
return 0;
}
編譯指令如下:
g++ -o app blob_demo.cpp -I /home/dane/env/caffe/include/ -D CPU_ONLY -I /home/dane/env/caffe/.build_release/src/ -L /home/dane/env/caffe/build/lib/ -lcaffe -lboost_system -lglog
/home/dane/env/caffe/爲caffe編譯目錄
執行之前添加環境變量
export LD_LIBRARY_PATH=/home/dane/env/caffe/build/lib/:$LD_LIBRARY_PATH
執行如下指令
./app
輸出爲:
Size : (0)
Size : 1 2 3 4 (24)
a[0][0][0][0]=-23
q[0][0][0][0]=23
a[0][0][0][1]=-21
q[0][0][0][1]=22
a[0][0][0][2]=-19
q[0][0][0][2]=21
a[0][0][0][3]=-17
q[0][0][0][3]=20
a[0][0][1][0]=-15
q[0][0][1][0]=19
a[0][0][1][1]=-13
q[0][0][1][1]=18
a[0][0][1][2]=-11
q[0][0][1][2]=17
a[0][0][1][3]=-9
q[0][0][1][3]=16
a[0][0][2][0]=-7
q[0][0][2][0]=15
a[0][0][2][1]=-5
q[0][0][2][1]=14
a[0][0][2][2]=-3
q[0][0][2][2]=13
a[0][0][2][3]=-1
q[0][0][2][3]=12
a[0][1][0][0]=1
q[0][1][0][0]=11
a[0][1][0][1]=3
q[0][1][0][1]=10
a[0][1][0][2]=5
q[0][1][0][2]=9
a[0][1][0][3]=7
q[0][1][0][3]=8
a[0][1][1][0]=9
q[0][1][1][0]=7
a[0][1][1][1]=11
q[0][1][1][1]=6
a[0][1][1][2]=13
q[0][1][1][2]=5
a[0][1][1][3]=15
q[0][1][1][3]=4
a[0][1][2][0]=17
q[0][1][2][0]=3
a[0][1][2][1]=19
q[0][1][2][1]=2
a[0][1][2][2]=21
q[0][1][2][2]=1
a[0][1][2][3]=23
q[0][1][2][3]=0
ASUM=288
SUMSQ=4600
b[0][0][0][0]=-23
b_diff[0][0][0][0]=23
b[0][0][0][1]=-21
b_diff[0][0][0][1]=22
b[0][0][0][2]=-19
b_diff[0][0][0][2]=21
b[0][0][0][3]=-17
b_diff[0][0][0][3]=20
b[0][0][1][0]=-15
b_diff[0][0][1][0]=19
b[0][0][1][1]=-13
b_diff[0][0][1][1]=18
b[0][0][1][2]=-11
b_diff[0][0][1][2]=17
b[0][0][1][3]=-9
b_diff[0][0][1][3]=16
b[0][0][2][0]=-7
b_diff[0][0][2][0]=15
b[0][0][2][1]=-5
b_diff[0][0][2][1]=14
b[0][0][2][2]=-3
b_diff[0][0][2][2]=13
b[0][0][2][3]=-1
b_diff[0][0][2][3]=12
b[0][1][0][0]=1
b_diff[0][1][0][0]=11
b[0][1][0][1]=3
b_diff[0][1][0][1]=10
b[0][1][0][2]=5
b_diff[0][1][0][2]=9
b[0][1][0][3]=7
b_diff[0][1][0][3]=8
b[0][1][1][0]=9
b_diff[0][1][1][0]=7
b[0][1][1][1]=11
b_diff[0][1][1][1]=6
b[0][1][1][2]=13
b_diff[0][1][1][2]=5
b[0][1][1][3]=15
b_diff[0][1][1][3]=4
b[0][1][2][0]=17
b_diff[0][1][2][0]=3
b[0][1][2][1]=19
b_diff[0][1][2][1]=2
b[0][1][2][2]=21
b_diff[0][1][2][2]=1
b[0][1][2][3]=23
b_diff[0][1][2][3]=0