【Caffe實踐】 添加自己的網絡層

寫在前面:

Caffe 中有衆多的網絡層,最新版本的代碼已經涵蓋了很多種類型的網絡層,然而,有時候由於各種原因,其給定的網絡層不能滿足我們的要求,這時候就要對其更改,以使其滿足自己的需求,感謝作者開源代碼以及衆多的代碼維護者。

由於Caffe 中的網絡層都是直接或者間接地給予Layer 基類,所以,在我們需要添加新的類型時,就需要選擇好自己的基類,以使我們能夠更好的利用基類已有的一些方法。我們新建的類可以基於
1. 直接繼承於Layer
2. 繼承於DataLayer
3. 繼承於NeuronLayer
4. 繼承於LossLayer
5. 或者如果是直接想改進某個層的代碼,可以直接繼承該類,並做相對應的修改即可。

具體步驟:

第一步, 添加頭文件.h ,可以自己新建一個頭文件,或者追加到一個已有的頭文件後面,比如include/DataLayer.hpp 等, 在裏面定義一些類變量等。

第二步,添加實現文件,創建類的實現函數,放在src/XXX.cpp 中,如果有cuda實現,則需要添加相對應的.cu文件實現,主要需要寫LayerSetup ,reshape ,forward ,backup 函數。

第三步, 註冊類,到src/caffe/layer_factory.cpp 中添加對應的類,在其中加入

REGISTER_LAYER_CLASS(MYLAYER, MyLayer);

第四步,在src/caffe/proto/caffe.proto 文件中,添加對應的類以及類參數。
在enum LayerType {}中添加一行

enum LayerType {
MYLAYER = ID 
}
//其中MYLAYER 是新添加的類名,ID是類編號,注意不能更之前的重複。

再添加類參數

optional MylayerParameter mylayer_param = ID2;
//其中MylayerParameter 是網絡層參數,ID2 是ID

最後定義類參數

message MylayerParameter {
  optional uint32 myparam1 = 1; 
  optional bool myparam2 = 2 [default = true]; 
}

第五步,寫測試文件,這個是可選的,不過爲了合併到github中,需要測試通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章