caffe学习之layer_factory(工厂方法)
来源:互联网 发布:支付宝能登陆淘宝吗 编辑:程序博客网 时间:2024/06/16 17:46
在caffe中,创建layer对象,是通过工厂方法来创建的。
相关代码,均定义在caffe/include/caffe/layer_factory.hpp,以及其实现类。
一.LayerRegistry
主要的实现是由LayerRegistry 类来完成的。
先上代码:
class LayerRegistry { public: typedef shared_ptr<Layer<Dtype> > (*Creator)(const LayerParameter&); typedef std::map<string, Creator> CreatorRegistry; static CreatorRegistry& Registry() { static CreatorRegistry* g_registry_ = new CreatorRegistry(); return *g_registry_; }.........}
可以看到,LayerRegistry 主要功能就是,是通过map来管理,layer的type(string)和layer的构造方法(Creator)的一个映射关系。
std::map<string, Creator>
二.REGISTER_LAYER_CLASS(type)——layer的注册
当一个xxlayer.cpp被写好之后,需要在LayerRegistry 进行相关的添加注册。
因此我们经常看到,在xxlayer.cpp的最后几行会有
REGISTER_LAYER_CLASS(type)
这行代码.比如caffe/src/caffe/layers/data_layer.cpp中的
REGISTER_LAYER_CLASS(Data);
那么这个宏定义到底完成什么呢?具体看layer_factory中的定义。
#define REGISTER_LAYER_CLASS(type) \ template <typename Dtype> \ shared_ptr<Layer<Dtype> > Creator_##type##Layer(const LayerParameter& param) \ { \ return shared_ptr<Layer<Dtype> >(new type##Layer<Dtype>(param)); \ } \ REGISTER_LAYER_CREATOR(type, Creator_##type##Layer)
这里又调用了另一个宏定义REGISTER_LAYER_CREATOR,具体看代码:
#define REGISTER_LAYER_CREATOR(type, creator) \ static LayerRegisterer<float> g_creator_f_##type(#type, creator<float>); \ static LayerRegisterer<double> g_creator_d_##type(#type, creator<double>) \
可以看到REGISTER_LAYER_CREATOR里声明了两个LayerRegisterer类,分别对应float和double,再具体看LayerRegisterer的构造方法:
template <typename Dtype>class LayerRegisterer { public: LayerRegisterer(const string& type, shared_ptr<Layer<Dtype> > (*creator)(const LayerParameter&)) { // LOG(INFO) << "Registering layer type: " << type; LayerRegistry<Dtype>::AddCreator(type, creator); }};
在LayerRegisterer的构造方法中调用了LayerRegistry::AddCreator方法,通过此方法,将新的layer添加到std::map
static void AddCreator(const string& type, Creator creator) { CreatorRegistry& registry = Registry(); CHECK_EQ(registry.count(type), 0) << "Layer type " << type << " already registered."; registry[type] = creator; }
总结而言就是:
1.REGISTER_LAYER_CLASS
2.REGISTER_LAYER_CREATOR
3.LayerRegisterer
4.AddCreator
这么做的主要目的是为了实现layer的动态注册。
三.创建layer
注册号之后,我们便可以在xxnet.prototxt中定义相关的layer了,比如,定义一个type:Data的layer:
layer { name: "mnist" type: "Data" top: "data" top: "label" include { phase: TRAIN } transform_param { scale: 0.00390625 } data_param { source: "examples/mnist/mnist_train_lmdb" batch_size: 64 backend: LMDB }}
当运行对应的xxsolver.net的时候,就会通过xxnet.prototxt中layer的type参数,调用LayerRegistry<Dtype>::CreateLayer
来实现layer的创建,具体见代码
// Get a layer using a LayerParameter. static shared_ptr<Layer<Dtype> > CreateLayer(const LayerParameter& param) { if (Caffe::root_solver()) { LOG(INFO) << "Creating layer " << param.name(); } const string& type = param.type(); CreatorRegistry& registry = Registry(); CHECK_EQ(registry.count(type), 1) << "Unknown layer type: " << type << " (known types: " << LayerTypeListString() << ")"; return registry[type](param); }
- caffe学习之layer_factory(工厂方法)
- CAFFE源码学习笔记之七-layer_factory以及layer基类
- Caffe中Layer_factory详解
- 梳理caffe代码layer_factory
- caffe源码追踪--layer_factory
- 梳理caffe代码layer_factory(六)
- caffe代码layer_factory梳理分析
- 设计模式学习之简单工厂、工厂方法、抽象工厂
- CAFFE源码学习之优化方法solver
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式入门学习之工厂模式(工厂方法模式)
- Design Pattern学习笔记之工厂(简单工厂、工厂方法、抽象工厂)
- java学习之工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式学习(二)之工厂模式(简单工厂+工厂方法+抽象工厂)
- 设计模式 学习之工厂方法模式
- 设计模式学习之---工厂方法模式
- 工厂方法之抽象工厂
- head first 设计模式学习之 简单工厂,工厂方法和抽象工厂
- iOS 推送配置证书和配置描述性文件
- OpenCV 基本模块
- Android中通过xml给布局添加边框
- Markdown编辑器
- ANR 总结
- caffe学习之layer_factory(工厂方法)
- Azure China下托管磁盘的使用
- Markdown中数学公式整理
- UE4学习笔记7th:在世界中放置相机Director
- Ubuntu下,将tiny版操作方式更改为full版
- 设置临时变量
- 语言的评论
- -------------------------study------------------------------
- linux下php扩展curl的安装