Caffe中的生产者模式

在这个代码layer_factory.hpp的开头
作者注释了怎么注册layer

  1. 比如我们PB的模型文件中有一层的type是DummyData
  2. 通过搜索grep -rni “REGISTER_LAYER_CLASS(Du” ./
    有些层搜不到比如Convolution
    那就可以搜索
    grep -rni “INSTANTIATE_CLASS(Convolution” ./

./src/caffe/layers/dummy_data_layer.cpp:149:REGISTER_LAYER_CLASS(DummyData);
可以搜索到在哪里注册层

从而在后面代码里面调用对应层的forward函数的时候就找到对应的实现了

注意 有一个很trick的地方

比如我在PB文件里定义了一个层的type为InnerProduct
按照上面的说法
我们搜索:
[root@localhost caffe-1.1.3]# grep -rni “REGISTER_LAYER_CLASS(InnerProduct” ./
./src/caffe/layers/inner_product_layer.cpp:189:// REGISTER_LAYER_CLASS(InnerProduct);
[root@localhost caffe-1.1.3]# grep -rni “INSTANTIATE_CLASS(InnerProduct” ./

./src/caffe/layers/inner_product_layer.cpp:187:INSTANTIATE_CLASS(InnerProductLayer);

认为这个层定义在./src/caffe/layers/inner_product_layer.cpp这个文件里面,看对应的forward_cpu函数
但其实不是
因为我们默认或者指定使用了mkldnn作为engine
在layer_factory.cpp的下面有一个函数GetInnerProductLayer
里面会根据engine去找对应的层return shared_ptr >(new MKLDNNInnerProductLayer(param));
比如mkldnn就应该是MKLDNNInnerProductLayer
在这个文件的forward_cpu函数里面会去调用对应的mkldnn的privimtive