天天看点

在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

继续阅读