caffe源碼分析--Blob應用

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章