如何更容易的开发和共享caffe新层

caffe项目中早已有不少人在尝试解决这个问题:
Allow self-contained development of Caffe layers · Issue #1896 · BVLC/caffe
Layer modules by hgaiser · Pull Request #5294 · BVLC/caffe
还有动态加载的讨论:
Decentralize development with layer parameter registration mechanism · Issue #3408 · BVLC/caffe

为什么要讨论这个问题,虽然Making a Caffe Layer Development等链接已给出了指导,但是因为caffe版本或者这样那样的原因,别人开发的新层要插入到你自己的caffe代码里也并不是容易的事情,开发新层要在不同的目录添加文件和修改文件,扒起来不易。较好的方法就是直接将新层的代码git clone下来与caffe一起编译最好了。
我们有交流model的 Model Zoo,但caffe的这个缺陷导致迟迟产生不了 Layer Zoo。各位在开发过程中添加的风格也很不统一,甚至部分人对caffe原有代码还有改动,这些代码合并起来颇为麻烦。

我的设想是在在caffe的src目录中再放一个plugins子目录,这个plugins目录中新加层就新加个子目录,一个新层一个子目录,绝不与caffe原有代码混淆。
但这里有个问题就是proto文件,虽然protobuf支持Extension特性,但是caffe网络初始化就要知道参数信息,无法基于 protobuf Extension 开发。
PR #5294 的方法是像python层一样使用一个param_str的通用参数,新层的特性参数就编码到这个字符串中。
我自己的方案就是新层也提供一个 .proto 文件,然后我编译前把所有层的 .proto 文件全部插入到 caffe.proto 文件中再编译。这个方案里,新层所有参数的使用完全和原有层一样,而不需要去解析param_str字符串拿参数。

2 thoughts on “如何更容易的开发和共享caffe新层”

    1. caffe2 我了解不太多。仅从当前的了解看,有一个Modules是干这个事情的,基本能解决问题吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注