一,概述
新层YxyLayer实现一个特别简单的功能,目的在于理解caffe中层的底层结构。
YxyLayer的功能:正向就是一个直接复制的过程,反向将梯度缩放制定的倍数。有时我们的网络存在分支,但我们不希望某一分支影响之前层的更新,那么我们就将梯度放缩0倍。
该层只有一个参数:diff_scale,默认为1。
二,整体结构
在caffe根目录下进行一下4处更新:
1,在include/caffe/layers/ 目录下添加 yxy_layer.hpp 文件,作用:声明新层的头文件。
2,在src/caffe/layers/ 目录下添加 yxy_layer.cpp 文件,作用:对 yxy_layer.hpp 进行 cpu 上的实现。
3,在src/caffe/layers/ 目录下添加 yxy_layer.cu 文件, 作用:对 yxy_layer.hpp 进行 gpu 上的实现。(未实现,后续添加)
4,修改src/caffe/proto/ 目录下的caffe.proto 文件,作用:为YxyLayer添加参数和消息函数,这样我们才能在prototxt中使用新层。
三,实现细节
1,不同功能类型的层所引的头文件也不同,可以到 “include/caffe/layers” 和 “src/caffe/layers” 目录下找相似的现成的层参考。
2,(关键) 修改src/caffe/proto/ 目录下的caffe.proto 文件,为YxyLayer添加参数和消息函数。一定要严格按照大小写!!!
(1)首先,在文件末添加消息函数:
(2)然后,YxyLayer有一个diff_scalev参数,因此我们首先应该在message LayerParameter {}中添加新参数信息。添加信息时,首先要制定一个唯一ID,这个ID的可选值可以由这句话看出:
可选ID是151,因此按图所示添加完成,记得添加后把注释中的151改为152,方便下次添加。
(3)添加新参数信息后,在message V0LayerParameter {}添加参数定义 :
(4)最后,在message V1LayerParameter {}中的enum LayerType {}中的第一行添加唯一ID:
这里ID只要不重复即可。(可能在 prototxt 定义层中的type用的就是这个名字,待定。)
外面接着添加,同样ID也是只要不重复即可:
四, 重新编译 caffe 即可使用
cd caffe
make clean
make all -j4
make pycaffe
然后就能用了,例: