如何閱讀caffe原始碼
如何解讀Caffe原始碼
導讀
Caffe是現在非常流行的深度學習庫,能夠提供高效的深度學習訓練。該庫是用C++編寫,能夠使用CUDA呼叫GPU進行加速。但是caffe內建的工具不一定能夠滿足使用者的所有需求,所以閱讀原始碼並理解它,是很有必要的。
這篇博文不是想把Caffe的所有函式都講一遍,因為Caffe的原始碼很大,一本書都不一定能夠說清楚。這裡我只是說說該怎麼去閱讀原始碼,給大家提供一個思路和建議,讓大家能夠快速把握caffe的整體,出了問題該往哪個方向去思考。
caffe的編譯,網上已有很多教程,大家可以看看這篇。
Caffe的檔案組織方式
目錄 | 功能 |
---|---|
caffe-master | 根目錄 |
build | 編譯後的存放的目錄 |
data | examples使用到的所有資料都放在這裡了 |
docs | 這裡有很多講解caffe的檔案,新手可以把這裡的東西好好看看。.md檔案推薦使用atom軟體進行檢視 |
examples | 這裡是放例子的地方,可以藉著這些例子好好理解下該怎麼用caffe。特別是mnist |
include | 這裡存放著caffe的所有標頭檔案。閱讀標頭檔案可以讓人很快地把握全域性而不考慮具體實現 |
matlab | 和 matcaffe有關的檔案 |
models | 這裡有一些如何寫deploy檔案的示例,可以用在訓練完成後釋出你的模型 |
python | 和pycaffe有關的檔案都放在這裡了。在python中使用caffe時,需要把該路徑給加上 |
scripts | 一些幫助使用caffe的指令碼 |
src | 標頭檔案的實現都在這裡 |
tools | 一些常用的工具的原始碼,編譯後的可執行檔案在build/tools中 |
理解示例
examples裡面由好幾個caffe的示例,開啟mnist看下,裡面由很多檔案,我們先看readme.md。裡面很好的講解了如何執行這個模型,以及各個引數代表什麼意思。讀懂了這個的話,基本上你就會執行示例了。其他的示例也可以照這樣學習。值得一提的是,學習這個部分時,可以結合docs裡面的講解,還有一些 *.ipynb。如何檢視ipynb就不說了,自己查資料。
示例執行得差不多,你就可以琢磨下如何使用deploy檔案了。
理解caffe原始碼
為了更好的閱讀程式碼,我建議按如下步驟使用Eclipse開啟caffe工程:
- 配置下java,因為Eclipse需要java環境
- 下載eclipse cpp版
- 開啟Eclipse,在選單欄File->import->c/c++->Existing code as Autotools project,按next,然後在browse中找到caffe-master,進入caffe-master後按確認。
這樣就匯入了整個工程了,但是不要嘗試使用Eclipse來編譯caffe,因為基本上都編譯不通過。
blob、layer、net、solver這幾個是要好好閱讀的(標頭檔案以及實現),可以結合這docs裡面的檔案看。看懂了這幾個檔案,那麼你基本上就大概知道caffe是如何執行的了。
但是你可能在執行示例時很納悶,每個層那麼多的引數,我該怎麼知道它是什麼意思。別擔心,所有的這些資訊都可以在src/caffe/proto/caffe.proto中找到。看不懂的話,可以查一下protobuf的使用。
上面的如果都看懂了,那就可以好好研究下src/caffe/layers裡面的檔案了,把mnist用到的那些層好好看看它是怎麼實現的,可以先看cpp,有cuda基礎的就看看cu。
新增自己的層
新增自己的caffe層需要有一定的c++基礎,至少要明白什麼是繼承,什麼是虛擬函式,以及多執行緒的基本概念。可以選擇繼承一個和自己功能最相近又滿足繼承關係的層。
具體的步驟可以參考下這篇博文。
使用pycaffe
使用pycaffe的話,我推薦使用cmake而不是直接的make編譯工程,因為現在的版本中make後的pycaffe經常出現找不到連結庫。
現在是看*.ipynb檔案的時候了,裡面詳細講解了如何使用caffe的Python介面。出現問題的話就看原始碼。建議使用pycharm或者Eclipse Java版。