开发一个新层
- 添加一个层的类声明到:
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_gpu和Backward_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)定义。

571

被折叠的 条评论
为什么被折叠?



