caffe框架研究 一

2021-08-01 16:53:21 字數 1387 閱讀 4939

最近一直在研究caffe原始碼,將一些心得體會記錄下來,以便以後查閱。

首先記錄乙個c++ template的知識,caffe大量使用了template,但貌似只支援float與double型別的資料。定義了template的函式,如果在.h檔案中宣告,在cpp檔案中定義的話,在其他的檔案include標頭檔案之後再呼叫此函式,會出現無法解析的外部符號的錯誤,這是由於template的函式定義與宣告應該放在乙個檔案中進行,不要像我們寫其他**的時候習慣性的建立兩個檔案,因為在你的呼叫檔案中include了標頭檔案,但標頭檔案中只有template函式的宣告,template比較特殊,只有例項化之後鏈結器才能找到其位置從而進行呼叫,所以我們只include標頭檔案,鏈結器還是不知道這個函式在**,具體怎麼執行。所以template函式定義與宣告都放在乙個檔案下就可以了。這樣鏈結器不需要去其他的c檔案編譯出來的obj中找函式,所以就不會出現錯誤。(因為這個函式就在你這個檔案中,不需要鏈結其他的)。但是如果我們覺得寫在乙個檔案中封裝的感覺就沒有了,還是想分別建立h與cpp檔案,其實也是可以的,就是在cpp檔案中對template函式顯示例項化,具體就是給template乙個具體的型別(float,int等等),而呼叫它。這樣編譯器在編譯這個cpp的時候就知道template的函式的具體定義了,鏈結器也能找到它。

所以,記錄的第乙個知識點就是顯示例項化,caffe中叫做//explicit instantiation

第二個知識點是convlution_layer的實現過程,caffe中不是單純的做卷積運算,而是先把要做卷積的影象執行im2col函式(應該是跟matlab學的),將影象轉化為很大的乙個矩陣,跟filter直接做內積,來得到卷積結果,這種方式雖然將本來占用空間不大的影象變成了很大的矩陣(因為這個矩陣有很多重複的數,卷積每走一步,還是會有很多重複的點參與運算,自己考慮),記憶體占用大了,但是**看起來會比較清晰,速度也能提高(因為呼叫了矩陣乘法的加速庫blas等等)。比如以下code:

先執行了im2col函式,然後執行caffe_cpu_gemm就是矩陣乘加,1.是alpha,0.是peta,這個函式的意義是最後乙個引數等於alpha*weights*col_buff+peta*output,當然都是矩陣的首指標。weight就是卷積核的權重,col_buff就是將輸入影象變形了的矩陣。cpu_data與mutable_cpu_data函式可以理解為把caffe中封裝的blob型別的變數取址,賦給我們需要用的變數參與運算(如float*,double*等)。加個mutable就相當於我們要改變這個buffer中的值,比如output,不加就是只讀取這個buffer的值讓他參與運算,並不改變它的值,如input和filter weight。

以後還會有很多知識點的記錄,爭取將caffe中比較重要的知識都涵蓋到

python caffe框架 caffe框架基礎

caffe的核心模組 caffe是乙個清晰而高效的深度學習框架,其作者是博士畢業於uc berkeley的賈揚清,目前在google工作。caffe是純粹的c cuda架構,支援命令列 python和matlab介面 可以在cpu和gpu直接無縫切換。caffe的核心模組有三個,分別是blobs l...

Caffe 框架介紹

1.caffe是一種開源軟體框架,內部提供了一套基本的程式設計框架,或者說乙個模板框架,用以實現gpu並行架構下的深度卷積神經網路,deep learning等演算法,我們可以按照框架定義各種各樣的卷積神經網路的結構,並且可以再此框架下增加自己的 設計新的演算法,該框架的乙個問題就是,只能夠使用卷積...

安裝caffe框架記錄

1 安裝虛擬機器及ubuntu ubuntu版本為16.04 2 安裝 sudo apt get install build essential 3 檢視 gcc version 此處版本為 ubuntu 5.3.1 14ubuntu2 5.3.1 4 安裝 sudo apt get install...