如何在caffe中自定义网络层
尽管Caffe已经为用户提供了相当多的可用的层,但是面对各种各样的深度学习应用,这些层是远远不够的,为此,我们可能需要定义自己的层来达到特定的功能。
一般情况下,如果仅仅需要对某个层进行少量的修改,可以直接修改源码中对应的层,然后重新编译。这种方法好处就是不需要去建立新的文件,也不需要修改proto等,但是坏处也很明显,你无法再使用原来的这个层,如果你确实不再用这个层,那这个还是可行的;如果你有可能还是需要原来的层呢?那么只好自己新建一种层了。
新建网络层的步骤
1、选择继承的类
可以根据自己的需要,从已有的类中选择自己继承的类,这样可以省却很多麻烦。一般可以继承的类包括
层 | 描述 |
---|---|
Layer | 如果你要定义的层和已有的层没有什么重叠,那么可以选择直接继承Layer |
DataLayer | 自定义网络输入层时,可以考虑继承它,内部的load_batch可能是你要重写的函数 |
NeuronLayer | 自定义神经层,也就是中间的进行运算的层 |
LossLayer | 如果现有的损失函数层不能满足需求,可以继承它 |
其实说的这几个只是举个例子,你还可以继承其他的任何层,但是一定要清楚自己的层的功能是不是和原来的层有继承关系,如果没有,最好不要继承。
2、修改代码
- 添加自己的头文件,以 .h 结尾,放到 include 文件夹中。
- 添加头文件对应的实现文件,放到 src/caffe/layers中,如果你要用GPU模式,则需要对应的 .cu 文件,也就是该层CUDA实现。
- 注册自己的类。在src/caffe/layer_factory.cpp中加入自己的类名,可以仿照该文件中别的层写法,注意名字不能重复。
- 在src/caffe/proto/caffe.proto添加proto消息。以message XXXParameter {…}方式添加,具体的可以参考你继承的类。
- 写测试函数,测试你的层到底有没有实现正确的功能。
写在最后
以上写的这些也不过是给了一些自定义层的建议,没有实际的展示例子,我后面会尽量补充上来。添加自己的层看起来似乎很难,但是实际上有好多Caffe已有的层作为例子,还是很好实现的。另外,要想添加自己的层,还是需要一些c++模板、多态等方面的只是,至少要知道什么是模板,哪些是重写,哪些是覆盖。
本人创建了一个Github项目,主要是做Caffe的各种帮助(才刚开始做,内容略少,后续会持续更新),有兴趣的话,可以多多关注。