如何将他人实现的caffe的层整合到自己caffe的框架下

来源:互联网 发布:mac virtualbox 全屏 编辑:程序博客网 时间:2024/06/06 02:58

    使用caffe时,前人已经实现了很多层的功能,合理利用前人实现的层可以帮助我们快速的实现自己的想法。但由于caffe没有明确的版本,不同工作所使用的caffe可能有较大的差别,包括部分底层的函数可能都有变化。有如下建议:

1、尽量避免使用最新版的caffe,自己使用的caffe与所用的代码中的caffe应尽可能接近。

    目前最新版的caffe,对于每个类有它对应的**layer.hpp和**layer.cpp文件。但老版本的caffe中,每个类都有自己的实现文件**layer.cpp,但声明文件都是派生于layer.hpp和neuron_layers.hpp等文件,并在vision_layers.hpp中指明每个类可视化的参数。为了减少工作量,应选择基本框架尽可能一直的caffe。

2、需要修改的文件

    必须有对应的声明文件**layer.hpp和实现文件**layer.cpp。对于需要从train_val.prototxt中传入参数的layer,需要在caffe.proto中添加相应的关键字。有时候可能需要修改vision_layers.hpp(注意,不同版本的caffe中vision_layers.hpp的写法不一样).

3、注意事项

(1)在prototxt文件中,旧版用layers,新版需要用layer,否则关键字无法识别。

4、数据输入层

    数据输入时,一般涉及读写文本文件的操作,会用到C++中vector、string等类型的变量,需要注意不同类型的变量能够执行不同的操作。

    caffe中使用blob以四维数组的形式存储数据,[0][1][2][3]分别对应num, channel, width 和hight。当不清楚数据的大小形式时,可以使用LOG(INFO)<<"num "<<num,输出进行查看。

5、声明文件

    在声明文件中,下述语句用于指示某一层输入输出blob的个数:

 virtual inline int ExactNumBottomBlobs() const { return 1; }
 virtual inline int ExactNumTopBlobs() const { return 1; }

 virtual inline int MinTopBlobs() const { return 1; }
 virtual inline int MaxTopBlobs() const { return 2; }

等。

6、实现文件

(1)blob指针具有以下属性:num,channel,width,hight,以及:

count,count = num*channel*width*hight

可以据此计算,dim = count / num;

(2)Backward实现中,propagate_down[0]、propagate_down[1]等分别用于计算对于第1、2等输入的修正量。没有修正的层,需要将其_diff置为0.






0 0