天天看點

在caffe中添加自定義層

Caffe中添加自定義層[6,7]

1)頭檔案 路徑:py-faster-rcnn/caffe-fast-rcnn/include/caffe/layers

2)CPP或者CU檔案 fasterrcnn_huawei/py-faster-rcnn/caffe-fast-rcnn/src/caffe/layers 3)caffe.proto定義該層的參數 py-faster-rcnn/caffe-fast-rcnn/src/caffe/proto/caffe.proto proposal_layer.cpp 3.1)message LayerParameter { } 修改 添加消息函數的ID,設定ID。 message LayerParameter { optional WindowDataParameter window_data_param = 129; // 目前,唯一的值,不能重複,最大值為143以及另外較大數值 optional ProposalParameter proposal_param = 144; } 3.2) 添加消息函數(任意位置) 按順序指明參數。 message ProposalParameter { optional float diff_scale = 1 [default = 1]; //預設梯度不縮放, 暫時不添加

}

3.3) 添加Layer ID(可能不需要添加) 首先,在 message V1LayerParameter { }中的 enum LayerType { PROPOSAL=xxx; // 不重複即可 } 然後在繼續添加 message V1LayerParameter { enum LayerType { WINDOW_DATA = 24; PROPOSAL=xxx; // 不重複即可 } optional WindowDataParameter window_data_param = 20 }

3.4) 添加參數定義message V0LayerParameter {}(可能不需要添加) 不再推薦的方式,這個與ProposalParameter 是什麼關系?? message V0LayerParameter { }

3.5 定義一個層 layer{ name: "proposal" type: "Proposal" bottom: "" // 與python版本一緻 top: "" // 與python版本一緻

}

注:可以參考DataLabelParameter

4)注冊層 在CPP檔案中添加 INSTANTIATE_CLASS(DiffCutoffLayer); REGISTER_LAYER_CLASS(DiffCutoff); 小結:定義一個新的層,簡單來說分為兩個步驟: 參考資料[3,4,5,6,712] 1)聲明和定義該層的類,分别在hpp和cpp檔案中聲明和定義該類,并且需要在cpp檔案中對該層進行注冊,用下面的兩行代碼(下面所示)注冊後,則不需要在layer_factory.cpp檔案中 添加構造該新層對象的函數。通常新層會繼承子已有的層次,例如layer.cpp層,需要在新層中定義基類中的純虛函數。例如對于layer層,包括三個虛函數(Backward_cpu, Forward_gpu和Reshape)。 對于隻包含測試過程的層,可以通過在Backward_cpu的定義代碼中隻添加“NOT_IMPLEMENTED;”來表示未定義反向傳播函數。 INSTANTIATE_CLASS(DiffCutoffLayer); REGISTER_LAYER_CLASS(DiffCutoff); 2)配置該層:包括注冊和在caffe.proto中設定相關參數。在較新版本的caffe中,使用者隻需要 在編譯caffe的過程中,會根據caffe.proto檔案中定義的參數接口來編譯相關層的代碼。一般隻需要做3.1和3.2兩部即可。 注意:不需要在layer_factory.cpp檔案中添加新層的頭檔案。

[1] http://zhangliliang.com/2015/05/17/paper-note-fast-rcnn/ [2] http://blog.csdn.net/anxiaoxi45/article/details/46522155 [3] caffe/src/caffe/proto/caffe.proto [4] https://developers.google.com/protocol-buffers/ [5] http://caffe.berkeleyvision.org/tutorial/layers.html [6] http://caffecn.cn/?/question/388 [7] http://blog.csdn.net/shuzfan/article/details/51322976 [8] http://blog.csdn.net/seven_first/article/category/5721883 // caffe源碼解析 [9] https://github.com/shicai/Caffe_Manual // 模型建立過程 [10] https://github.com/BVLC/caffe/wiki/Solver-Prototxt [11] http://karpathy.github.io/neuralnets/ [12] https://github.com/BVLC/caffe/wiki/Development#developing-new-layers

繼續閱讀