给网络添加一个新层

给网络中添加一个caffe已经实现的新层,从哪个文件可以知道需要设置什么参数?proto?类似一般中,如何知道conv层中都应该包含哪些参数?
已邀请:

ruirui_ICT - 听大大们说,要“左手代码,右手公式”,喵~

赞同来自: cjwdeq 今天可以2 牧马人夏峥123 Francis_ZHOU CCamaro321 suge2016更多 »

最近太忙好久没来答题了,今天答一下凑个热闹~
下面讲讲如何在caffe中添加一个新的层。官网的wiki里有一个比较不错的介绍,可以参考一下caffe github: Developing new layers。下面我会讲一个例子,如何添加一个层实现和全连接层InnerProductLayer一模一样的功能(然后就可以偷懒复制全连接层的代码了o(* ̄︶ ̄*)o)
假设现在要添加的层名叫NewLayer,添加一个层和添加一个类很像,需要写这个层的头文件、cpp文件(如果想在GPU上跑还需要写cu文件),由于需要在prototxt里设置这个层的参数,还需要在caffe.proto里定义这个层的参数类,然后再把其他细节的地方(比如注册层)写好,就差不多了。
 
1.写头文件。原来版本的caffe在include里分了四大类,vision\common\loss\data layer,现在的版本好像变成每个层有自己单独的hpp文件了。比如原来的InnerProductLayer的声明都是写在common_layer.hpp中的,可以参考一下,写好函数和一些内部参数的声明和定义。
2.写cpp/cu文件。一般会写在src中的layer文件夹里,包含LayerSetup\Reshape\Forward\Backward四大函数,LayerSetup会进行一些check,初始化一些参数什么的,Reshape会对参数分配空间,Forward和Backward会计算前向和后向传播,当然cpp文件里写的是cpu上的,cu文件里写gpu上的计算(一般来说计算的方法和结果是一样的,于是很多人偷懒就只写cu文件里的实现),一般cu文件里就只需要写Forward和Backward,LayerSetup和Reshape写在cpp文件里就好了。需要注意一下在cpp文件最后会对层进行注册,如下
INSTANTIATE_CLASS(InnerProductLayer);
REGISTER_LAYER_CLASS(InnerProduct);
3.在caffe.proto文件中添加这个层的参数,首先需要在message LayerParameter中设置一个ID号(顺着往下加),类似于
option NewLayerParameter new_layer_param = 140;
然后在后面添加NewLayerParameter的一些成员,然后就可以在train.prototxt文件中给这些参数赋值了。题主如果比较关注conv层,可以查看一下message ConvolutionParameter。
4.最后添加一些其他可能需要的地方,比如在upgrade_proto.cpp中添加一些if。。这个文件我没弄太清楚,我理解的是prototxt里有一些不同的层的参数名字是一样的,所以需要update一下才不会乱。
 
总体讲大概就是这个流程,希望对大家有帮助O(∩_∩)O~
(针对最近大大们头疼的侵权问题,在这里弱弱的加一句:本内容为本人原创,仅授权给CaffeCN社区(caffecn.cn)使用,如需转载须注明转载来源。(⊙v⊙))
 
 
 

今天可以2

赞同来自:

http://caffe.berkeleyvision.org/tutorial/layers.html
这里有介绍,不过不全面
你可以直接看./src/caffe/proto/caffe.proto文件,不过刚开始看可能比较烦
 

0xcc - boom shakalaka

赞同来自:

我用的caffe-win的版本,可以不用在caffe.proto中添加的。
写好hpp和cpp扔进去就OK了

要回复问题请先登录注册