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