关闭

如何在新版本caffe里添加新的一层

1635人阅读 评论(1) 收藏 举报
分类:
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框架!

上文表述不清的欢迎私聊,拒绝一切无脑伸手党!

2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:446444次
    • 积分:6004
    • 等级:
    • 排名:第4661名
    • 原创:85篇
    • 转载:303篇
    • 译文:10篇
    • 评论:184条
    简介
    研二在读,关注:深度学习,计算机视觉,机器学习,图像处理。博文主要是自己的一些总结。转载文章供资料学习(转载一些最新文章),如有侵权望告知。注:有些评论没有回复,最近比较忙不好意思。
    最新评论