1. 程式人生 > >caffe原始碼學習--blob基本用法(基於《21天實戰caffe》)

caffe原始碼學習--blob基本用法(基於《21天實戰caffe》)

1、p102頁編寫blob_demo.cpp後g++編譯生成app檔案。

在趙老師的書中,很簡單就寫成功,估計會有人出現一些錯誤。其實不是路徑問題,是格式的問題,嘿嘿!

在你寫好Blob模板類。生成可執行程式app的時候就會出現錯誤! 
CAFFE_ROOT是您之前安轉caffe的根目錄。 
原先是:

~/caffe$ g++ -o app blob_demo.cpp -I $CAFFE_ROOT/include/ -D CPU_ONLY -I $CAFFE_ROOT/.build_release/src/ -L $CAFFE_ROOT/build/lib/ -lcaffe  
  • 1
  • 1

改寫:

~/caffe$ g++ -o app blob_demo.cpp -I/home/
您伺服器名字/caffe(博主caffe安裝所在路徑,與上面CAFFE_ROOT類似)/include/ -D CPU_ONLY -I/home/您伺服器名字/caffe/.build_release/src/ -L/home/您伺服器名字/CAFFE_ROOT/build/lib/ -lcaffe
  • 1
  • 1

改寫成這樣就好了。

之後,執行改程式的時候,還會有一些錯誤。 
原先是:

$export LD_LIBRARY_PATH=$CAFFE_ROOT/build/lib/:$LD_LIBRARY_PATH
$./app
Size: (0)
Size: 1 2 3 4 (24)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

改為:

$export LD_LIBRARY_PATH
=/home/您伺服器名字/caffe/build/lib/:$LD_LIBRARY_PATH $./app Size: (0) Size: 1 2 3 4 (24)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
2、以下p103頁更改blob_demo.cpp檔案

即新增

  1.   Blob<float> a;  
  2.     a.Reshape(1,2,3,4);  
  3.     float *p=a.mutable_cpu_data();  
  4.     float *q=a.mutable_cpu_diff();  
  5.     for(int i=0;i<a.count();i++){  
  6.         p[i]=i;  
  7.     q[i]=a.count()-i-1;  
  8.     }  
  9.     a.Update();  
  10.     for(int u=0;u<a.num();u++){  
  11.         for(int v=0;v<a.channels();v++){  
  12.             for(int w=0;w<a.height();w++){  
  13.                 for(int x=0;x<a.width();x++){  
  14.                     cout<<"a["<<u<<"]["<<v<<"]["<<w<<"]["<<x<<"]="
  15.                         <<a.data_at(u,v,w,x)<<endl;  
  16.                 }  
  17.             }  
  18.         }  
  19.     }  
  20.  retun 0;
  21. }

後利用1中命令編譯g++發現以下報錯:

問題原因:沒有新增正確的glog共享物件庫,應該在Miscellaneous->Other Objects中新增/usr/local/lib/libglog.so,同時Libraries(-I)中新增glog。

解決方案:下載並安裝glog

第一步:

// 檢視目錄 /usr/lib 或 /usr/local/lib的目錄下是否存在libglog.so.0
$ find libglog*
libglog.a
libglog.la
libglog.so
libglog.so.0
libglog.so.0.0.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果不存在需要安裝,方法如下: 
 Google Logging Library(glog),下載地址:https://code.google.com/p/google-glog/(下載不下來百度搜索glog-0.3.3.找別人分享的),然後解壓安裝:

$ tar zxvf glog-0.3.3.tar.gz$ cd glog-0.3.3$ ./configure$ make
$ sudo make install
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

如果沒有許可權就chmod a+x glog-0.3.3 -R , 或者索性 chmod 777 glog-0.3.3 -R(獲取許可權解鎖) , 裝完之後,這個資料夾就可以kill了。

注意:安裝完之後如果還是報錯,要在編譯命令g++後面加入-lglog:

g++-o app blob_demo.cpp-lglog

3、如果繼續報錯

/usr/bin/ld: /tmp/ccaK5QcQ.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
//usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0: error adding symbols: DSO missing from command line

問題原因:未安裝bloost庫,樓主本來以為自己安裝了,結果一搜索才知道是在配置tensorflow時下載的。不能相互通用,因為TensorFlow是內建在框架中的,而caffe是呼叫ubuntu系統安裝的bloost。 解決方案:下載並安裝,先下載boost_1_58_0.tar.bz2,具體百度搜索,然後解壓 解壓命令:tar jxvf boost_1_58_0.tar.bz2 安裝命令:
cd boost_1_58_0        #進入boost_1_58_0
# 只安裝caffe需要的3個元件,全部安裝十分耗時,還可能報錯
./bootstrap.sh --with-libraries=system,thread,python 
./b2
sudo ./b2 install
注意:在g++編譯語句的後面要加上-lboost_system,再次執行之後發現生成了app檔案完美 總結:在安裝了glog和boost庫之後的完整編譯語句為:
$ g++ -o app blob_demo.cpp -lglog -lboost_system -I/home/您伺服器名字/caffe/include/ -D CPU_ONLY -I/home/您伺服器名字/caffe/.build_release/src/ -L/home/您伺服器名字/caffe/build/lib/ -lcaffe
之後就可以繼續執行app檔案了, 語句:
$exportLD_LIBRARY_PATH=$caffe/build/lib/:$LD_LIBRARY_PATH
$./app 結果: Size : (0)
Size : 1 2 3 4 (24)
a[0][0][0][0] = 0
a[0][0][0][1] = 1
a[0][0][0][2] = 2
a[0][0][0][3] = 3
a[0][0][1][0] = 4
a[0][0][1][1] = 5
a[0][0][1][2] = 6
a[0][0][1][3] = 7
a[0][0][2][0] = 8
a[0][0][2][1] = 9
a[0][0][2][2] = 10
a[0][0][2][3] = 11
a[0][1][0][0] = 12
a[0][1][0][1] = 13
a[0][1][0][2] = 14
a[0][1][0][3] = 15
a[0][1][1][0] = 16
a[0][1][1][1] = 17
a[0][1][1][2] = 18
a[0][1][1][3] = 19
a[0][1][2][0] = 20
a[0][1][2][1] = 21
a[0][1][2][2] = 22
a[0][1][2][3] = 23
ASUM = 276
SUMSQ = 4324
  • 1
  • 2
  • 3
  • 4
  • 5

3、太不幸了,博主之前編譯好的app竟然在隔日重新開機後再次執行卻再次出現報錯,在命令$ ./app之後出現錯誤:

./app: error while loading shared libraries: libcaffe.so.1.0.0-rc5: cannot open shared object file: No such file or directory

錯誤原因:無法呼叫共享庫libcaffe.so.1.0.0-rc5,網上搜索,此檔案在caffe框架下build/lib路徑下,將此檔案拷貝複製一份在你的app檔案所在目錄下,再次執行./app,成功!!!心好累