深度学习之Caffe完全掌握:用C++开发(自定义)网络层
来源:互联网 发布:尊而光律所怎么样知乎 编辑:程序博客网 时间:2024/06/05 10:05
深度学习之Caffe完全掌握:用C++开发(自定义)网络层(纯cpu实现)
意义
当你想实现论文中某个前卫的方法时,caffe中纷繁的网络层模型也不再够用,需要自行定义。同理,你也可以写自己的损失层、数据层和视觉层来加入到网络模型。
我们要做什么
我们要实现一个叫NewLayer的新层,这是一个全通层,它并不做任何事情,只是为了方便展示如何加入自定义的网络层。
我们要添加一个新层,要做以下四件事:
- 在include/caffe/layers中创建头文件:new_layer.hpp
- 在src/caffe/layers中创建实现文件:new_layer.cpp
- 在src/caffe/layers中创建cuda实现文件:new_layer.cu
- 在src/caffe/caffe.proto中添加一些定义内容
注意:之前的要在layer_factory中在 Layer 工厂注册新 Layer 加工函数这一步不再必要了!!
顺便提一句
使用python接口,需要先编译:
[root@master ]# cd /download/caffe[root@master ]# make pycaffe
开始完成那四件事
我们不实现GPU功能,所以省略第三步。
在include/caffe/layers中创建头文件:new_layer.hpp
#ifndef CAFFE_HANSS_LAYER_HPP_ #define CAFFE_HANSS_LAYER_HPP_ #include <vector> #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 NewLayer : public NeuronLayer<Dtype> { public: explicit NewLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual inline const char* type() const { return "AllPass"; } protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; } // namespace caffe #endif
在src/caffe/layers中创建实现文件:new_layer.cpp
#include <algorithm> #include <vector> #include "caffe/layers/new_layer.hpp" #include <iostream> using namespace std; #define DEBUG_AP(str) cout<<str<<endl namespace caffe { template <typename Dtype> void NewLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& 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 New Layer's forwarding."); DEBUG_AP(this->layer_param_.new_param().key()); } template <typename Dtype> void NewLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& 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 New Layer's backwarding."); DEBUG_AP(this->layer_param_.new_param().key()); } #ifdef CPU_ONLY STUB_GPU(NewLayer); #endif INSTANTIATE_CLASS(NewLayer); REGISTER_LAYER_CLASS(New); } // namespace caffe
在src/caffe/caffe.proto中添加一些定义内容
注意对照前后代码,添加我写的下面代码里的关于new_layer的代码:
... ... optional TileParameter tile_param = 138; optional WindowDataParameter window_data_param = 129; //mymodel optional HanssParameter new_param = 155;}//mymodelmessage NewParameter { optional float key = 1 [default = 0]; } // Message that stores parameters used to apply transformation// to the data layer's datamessage TransformationParameter {... ...
然后记得重新编译caffe与pycaffe!
最后,写一个网络测试,我只写这个网络层及其它前后两个:
layer { name: "ip1" type: "InnerProduct" bottom: "data" top: "ip1" param { lr_mult: 1 } param { lr_mult: 2 } inner_product_param { num_output: 50 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}layer { name: "relu1" type: "ReLU" bottom: "ip1" top: "ip1"}layer { name: "drop1" type: "Dropout" bottom: "ip1" top: "ip1" dropout_param { dropout_ratio: 0.5 }}layer { name: "newLayer" type: "Hanss" bottom: "ip1" top: "newLayer" hanss_param { key: 12.88 }}layer { name: "ip2" type: "InnerProduct" bottom: "newLayer" top: "ip2" param { lr_mult: 1 } param { lr_mult: 2 } inner_product_param { num_output: 50 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}layer { name: "drop2" type: "Dropout" bottom: "ip2" top: "ip2" dropout_param { dropout_ratio: 0.4 }}
完成,运行即可。
阅读全文
0 0
- 深度学习之Caffe完全掌握:用C++开发(自定义)网络层
- 深度学习之Caffe完全掌握:添加新的网络层(训练非图像纯数据)
- 深度学习之caffe Layers-Convolution层
- 【深度学习】caffe之卷积层
- 【深度学习】caffe之pooling层
- 深度学习之caffe的BN层
- caffe深度学习网络softmax层代码注释
- caffe深度学习网络relu层代码注释
- 深度学习caffe代码怎么读 & 添加新网络层
- 【深度学习框架Caffe学习与应用】第五课 自定义神经层和数据输入层
- 深度学习之caffe
- 深度学习之----caffe
- Caffe学习之自定义创建新的Layer层
- 深度学习之caffe 网络定义和相关操作
- 如何在caffe中自定义网络层
- 如何在caffe中自定义网络层
- 深度学习-用户自定义层
- caffe用python设置网络的Convolution层Pooling层和LRN--caffe学习(4))
- JAVA JNI开发应用实例
- 1504.ICCVPartial Person Re-Identification 论文笔记
- Redis分布式锁的正确实现方式(Java版)
- 12月第一篇博客
- java多线程[7]:CyclicBarrier
- 深度学习之Caffe完全掌握:用C++开发(自定义)网络层
- TIPS
- 数据结构总结之KMP
- JavaScript 中的强制类型转换
- 【newcoder 】数圈圈 【数位DP 模板】
- 如何在VMWare的Ubuntu虚拟机中设置共享文件夹
- Go的坑我慢慢填
- git reabse -i 合并commit
- Excel在统计分析中的应用—第十一章—相关分析-简单线性相关-散点图法