1. 程式人生 > >Caffe程式碼導讀(0):路線圖

Caffe程式碼導讀(0):路線圖

【Caffe是什麼?】

【部落格目的】

從接觸Caffe、編譯執行、閱讀程式碼、修改程式碼一路走來,學習到不少內容,包括深度學習理論,卷積神經網路演算法實現,數學庫MKL,計算機視覺庫OpenCV,C++模板類使用,CUDA程式編寫……

本部落格目的是為初學者清除程式碼閱讀中的障礙,結合官網文件、融入個人理解、注重動手實踐。

【如何開始】

在開始閱讀Caffe程式碼之前,應該做好下面幾件事:

(1)下載Caffe原始碼;

(3)編譯;

(4)執行例子(如MNIST、CIFAR10、ImageNet等);

【路線圖】

(1)Caffe原始碼閱讀路線圖應該是從CAFFE_ROOT/src/caffe/proto/caffe.proto開始,瞭解各類資料結構,主要是記憶體物件和序列化磁碟檔案的一一對應關係,知道如何從磁碟Load一個物件到記憶體,以及如何將記憶體物件Save到磁碟,中間的過程實現都是由Protobuf自動完成的。

(2)第二步就是看標頭檔案,不用急於去看cpp檔案,先理解整個框架。Caffe中類數目眾多,但脈絡十分清晰。在Testing時,最外層的類是Caffe::Net,包含了多個Caffe::Layer物件,而Layer物件派生出神經網路多種不同層的類(DataLayer, ConvolutionLayer, InnerProductionLayer, AccurancyLayer等),每層會有相應的輸入輸出(Blob物件)以及層的引數(可選,Blob物件);Blob中包括了SyncedMemory物件,統一了CPU和GPU儲存器。自頂向下去看這些類,結合理論知識很容易掌握使用方法。

(3)第三步就是有針對性地去看cpp和cu檔案了。一般而言,Caffe框架不需要修改,只需要增加新的層實現即可。例如你想自己實現卷積層,只需從ConvolutionLayer派生一個新類MyConvolutionLayer,然後將幾個虛擬函式改成自己的實現即可。所以這一階段關注點在演算法上,而不是原始碼本身。

(4)第四步就很自由了,可以編寫各類工具,整合到Caffe內部。在CAFFE_ROOT/tools/下面有很多實用工具,可以根據需要修改。例如從訓練好的模型中抽取引數進行視覺化可以用Python結合matplot實現。

(5)接下來,如果想更深層次學習,最好是自己重新寫一遍Caffe(時間充裕的情況)。跳出現有的框架,重新構建自己的框架,通過對比就能學到更多內容。