1、属于哪个类型的layer,就打开哪个hpp文件,这里就打开vision_layers.hpp,然后自己添加该layer的定义,或者直接复制Convolution_Layer的相关代码来修改类名和构造函数名都改为Aaa_Layer,如果不用GPU,将*_gpu的声明都去掉。 2、实现自己的layer,编写Aaa_Layer.cpp,加入到src/caffe/layers,主要实现Setup、Forward_cpu、Backward_cpu。 3、如果需要GPU实现,那么在Aaa_Layer.cu中实现Forward_gpu和Backward_gpu。 4、修改src/caffe/proto/caffe.proto,好到LayerType,添加Aaa,并更新ID,如果Layer有参数,添加AaaParameter类。 5、在src/caffe/layer_factory.cpp中添加响应代码。 6、在src/caffe/test中写一个test_Aaa_layer.cpp,用include/caffe/test/test_gradient_check_util.hpp来检查前向后向传播是否正确。
我使用的是目前(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框架!
上文表述不清的欢迎私聊,拒绝一切无脑伸手党!