Caffe-Windows添加新层

Caffe-Windows添加新层

Caffe自身提供了很多Layer,可以实现一些基础的功能。然而,很多情况下我们需要自己定义一些函数(Layer)嵌入到CNN中。下面是我的实现过程。

Caffe-Windows+CPU+VS2013
首先给出我添加的层(头文件和源文件)

all_pass_layer.hpp

#ifndef CAFFE_ALL_PASS_LAYER_HPP_  
#define CAFFE_ALL_PASS_LAYER_HPP_  

#include   

#include "caffe/blob.hpp"  
#include "caffe/layer.hpp"  
#include "caffe/proto/caffe.pb.h"  

#include "caffe/layers/neuron_layer.hpp"  

namespace caffe {
    template <typename Dtype>
    class AllPassLayer : public NeuronLayer {
    public:
        explicit AllPassLayer(const LayerParameter& param)
            : NeuronLayer(param) {}

        virtual inline const char* type() const { return "AllPass"; }

    protected:

        virtual void Forward_cpu(const vector*>& bottom,
            const vector*>& top);
        virtual void Forward_gpu(const vector*>& bottom,
            const vector*>& top);
        virtual void Backward_cpu(const vector*>& top,
            const vector<bool>& propagate_down, const vector*>& bottom);
        virtual void Backward_gpu(const vector*>& top,
            const vector<bool>& propagate_down, const vector*>& bottom);
    };

}  // namespace caffe  

#endif  // CAFFE_ALL_PASS_LAYER_HPP_  

all_pass_layer.cpp

#include   
#include   

#include "caffe/layers/all_pass_layer.hpp"  

#include   
using namespace std;
#define DEBUG_AP(str) cout<
namespace caffe {

    template <typename Dtype>
    void AllPassLayer::Forward_cpu(const vector*>& bottom,
        const vector*>& top) {
        const Dtype* bottom_data = bottom[0]->cpu_data();
        Dtype* top_data = top[0]->mutable_cpu_data();
        const int count = bottom[0]->count();
        for (int i = 0; i < count; ++i) {
            top_data[i] = bottom_data[i];
        }
        DEBUG_AP("Here is All Pass Layer, forwarding.");
        DEBUG_AP(this->layer_param_.all_pass_param().key());
    }

    template <typename Dtype>
    void AllPassLayer::Backward_cpu(const vector*>& top,
        const vector<bool>& propagate_down,
        const vector*>& bottom) {
        if (propagate_down[0]) {
            const Dtype* bottom_data = bottom[0]->cpu_data();
            const Dtype* top_diff = top[0]->cpu_diff();
            Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
            const int count = bottom[0]->count();
            for (int i = 0; i < count; ++i) {
                bottom_diff[i] = top_diff[i];
            }
        }
        DEBUG_AP("Here is All Pass Layer, backwarding.");
        DEBUG_AP(this->layer_param_.all_pass_param().key());
    }


#ifdef CPU_ONLY  
    STUB_GPU(AllPassLayer);
#endif  

    INSTANTIATE_CLASS(AllPassLayer);
    REGISTER_LAYER_CLASS(AllPass);
}  // namespace caffe  

以上定义的层实现了一种全通功能。这边的层比较简单,只作为一个例子方便实验。

将.hpp文件放到路径caffe-windows\caffe-master\include\caffe\layers下
将.cpp文件放到路径caffe-windows\caffe-master\src\caffe\layers下

修改caffe-windows\caffe-master\src\caffe\proto,共需要修改两处(关键)!
1.找到 LayerParameter 描述,增加一项:optional AllPassParameter all_pass_param =145;
注意,这里的参数设置不能与LayerParameter中其他参数相同!
2.仍然在 caffe.proto 中,增加 AllPassParameter 声明,位置任意。其功能是可以用于从 prototxt 中读取预设值。message AllPassParameter {
optional float key = 1 [default = 0];
}

以上两步完成后,我们需要的层的内容和参数都已经设置好了。接下来就是将我们定义的层加载到Caffe中去。

打开Caffe工程
Caffe-Windows添加新层_第1张图片
添加头文件
Caffe-Windows添加新层_第2张图片
添加源文件
Caffe-Windows添加新层_第3张图片

万事具备,编译下caffe工程
Caffe-Windows添加新层_第4张图片

应该是没有问题的,编译完后就可以使用啦- -!
下面简单测试一下

deploy.prototxt

name: “AllPassTest”
layer {
name: “data”
type: “Input”
top: “data”
input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
}
layer {
name: “ap”
type: “AllPass”
bottom: “data”
top: “conv1”
all_pass_param {
key: 12.88
}
}

.\Build\x64\Release\caffe.exe time -model examples/deploy.prototxt
pause

好啦,后面需要做的就是根据自己的需要修改层的内容。祝大家学习愉快!

———-参考资料http://blog.csdn.net/zb1165048017/article/details/59112034
http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/kkk584520/article/details/52721838
http://blog.csdn.net/u014565333/article/details/54017025

你可能感兴趣的:(caffe,caffe-windows,添加层,cnn卷积神经网络)