Caffe學習筆記--如何創建自定義Layer

更新pairloss的github鏈接

知乎首文

長達半年的實驗終於做完,謹以此系列記錄深度學習框架Caffe的一些學習筆記。

要求:掌握基本深度學習理論知識,擁有C++編程基礎,了解Caffe基本框架。(基本理論知識一知乎一大把,Caffe源代碼的閱讀日誌搜索也有一大把,這裡就不做累述)

背景:Ubuntu14.04+cuda7.5+cudnn5.1

我使用的是目前(2017.2.28)最新開源的Caffe。新版的Caffe較之老版本,個人感覺自己定製的空間大了很多(也有可能是以前對老版本代碼理解不夠),也更加開放。這裡簡單介紹增加Layer的步驟:

1.在caffe.proto增加對應的LayerParameter message。

2.在./include/caffe/layers/路徑下增加對應layer的聲明。

3.在./src/caffe/layers/路徑下增加對應layer的CPU,GPU實現文件。

4.在./src/caffe/test/路徑下增加對應layer的test文件。

最後在Caffe文件夾下make整個項目。沒有報錯就恭喜啦!

前段時間CVPR有一篇關於Triplet的論文,Fine-grained Categorization and Dataset Bootstrapping using Deep Metric Learning with Humans in the.後來想要使用類似的方法來約束自己的網路,不過沒有以三元組的形式,而是從相似對的思路出發,重新定義了Loss函數來訓練自己的網路。結合了很多資料,自己在Caffe框架中完成了Norm層,PairLoss層,以及對應的Data層。下面以PairLoss層為例,介紹如何在Caffe框架下增加自己的Layer。

1.在caffe.proto下,首先在message LayerParameter 中追加

optional PairLossParameter pairloss_param = 148; //limbo

這裡的148是目前LayerParameter的參數個數,後面的注釋是為了方便下次增加Layer時查詢最大參數個數,比如下次增加新的Layer,這時候就應該=149,以此類推。

另外還需要增加如下:

這樣可以在之後的prototxt網路說明文件中加入參數。如下圖

2.在./include/caffe/layers/路徑下增加PairLoss.hpp(代碼寫得丑,這裡就留個框架了,要代碼的請私信我)

3.在./src/caffe/layers/路徑下增加PairLoss.cpp以及PairLoss.cu (.cu文件指的是GPU版本是實現)。相信讀過Caffe源碼的朋友們都知道,必須實現對應的Forward_gpu,Backward_gpu,Forward_cpu,Backward_cpu,LayerSetUp。這裡面Forward,Backward分別指的是前向傳播以及反向傳播,而cpu和gpu指的代碼版本。LayerSetUp多數實在做初始化。而按如下方式可以在對應的函數中,實現調用prototxt文件layer層的參數。在這裡特指上文的dis參數。

這裡的Dtype類型就不做過多解釋了。

4../src/caffe/test/增加對應的test文件以便測試。和上文類似,這裡就不過多說明了。

這半年的實驗做下來,對自己的編程能力無疑是一種鍛煉。隨之TensorFlow1.0的發布,使用Caffe開發的小夥伴越來越少。不過我依舊覺得新手從Caffe框架入門,既可以跑實驗,又鍛煉了編程能力,何樂不為呢。十分感謝我的導師提供這個平台,也感謝賈揚清大佬的Caffe框架!

上文表述不清的歡迎私聊,拒絕一切無腦伸手黨!


推薦閱讀:

如何評價陳天奇團隊新開源的TVM?
如何看待顧險峰《看穿機器學習(W-GAN模型)的黑箱》這篇文章?
深度強化學習當中加入Memory replay的原因和作用是什麼?
深度學習在路徑規划上有哪些應用?
如何比較Keras, TensorLayer, TFLearn ?

TAG:深度学习DeepLearning | Caffe深度学习框架 | TensorFlow |