caffe自定义层

developing new layer

开发一个新层


  • 添加一个层的类声明到:include/caffe/layers/your_layer.hpp
    • 包括type的内联实现方法覆盖virtual inline const char* type() const { return "YourLayerName"; },将YourLayerName替换为你的层名称。
    • 实现{*} Blobs()方法来指定blob数量要求; 参阅/caffe/include/caffe/layers.hpp以使用内联{*} Blobs()方法强制执行top和bottom Blob计数。
    • 如果你只实现CPU代码,则省略* _gpu声明
  • src/caffe/layers/your_layer.cpp中实现层。
    • (可选)用于一次性初始化的LayerSetUp:读取参数,固定大小的分配等。
    • Reshape用于计算top blob的大小,分配缓冲区以及取决于bottom blob的形状的任何其它工作。
    • Forward_cpu用于层的计算
    • Backward_cpu用于其反向梯度传播(可选 - 图层可以是仅向前传播)
  • (可选)在layers/your_layer.cu中实现GPU版本Forward_gpuBackward_gpu
  • 如果需要,在proto/caffe.proto中声明参数,使用(然后增加)”next available layer-specific ID”(“下一个可用的特定于层的ID”)在需要的message LayerParameter之上。
  • 使用layer_factory.hpp中提供的宏在cpp文件中实例化并注册层。 假设有一个新层MyAwesomeLayer,可以使用以下命令实现它:
INSTANTIATE_CLASS(MyAwesomeLayer);
REGISTER_LAYER_CLASS(MyAwesome);
  • 注意,应该将注册代码放在自己的cpp文件中,因此实现层是自包含的。
  • 或者,如果您的图层有多个engines,也可以注册Creator。 示例见:caffe/layer_factory.cpp中的GetConvolutionLayer
  • test/test_your_layer.cpp中写入测试。 使用test/test_gradient_check_util.hpp来检查Forward和Backward。

仅向前传播层


如果写一个只包含在测试网络中的层,可不必编写反向传递。 可以在include/caffe/your_layer.hpp中编写一个Backward_cpu(或Backward_gpu)的内联实现以及您的图层的定义,如下所示:

virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {
  NOT_IMPLEMENTED;
}

NOT_IMPLEMENTED宏(在common.hpp中定义)会抛出一个错误日志“尚未实现”。 例如,查看准确度层(accuracy_layer.hpp)和阈值层(threshold_layer.hpp)定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值