前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >caffe源码分析-layer_factory

caffe源码分析-layer_factory

作者头像
bear_fish
发布2019-02-25 11:51:52
4910
发布2019-02-25 11:51:52
举报

caffe中有许多的layer,在net中创建连接layer是通过工厂模式的方式创建,而不是每一个new然后连接。在net.cpp中创建layer方式如下:

layers_.push_back(LayerRegistry<Dtype>::CreateLayer(layer_param));

下面简要分析下layer_factory

代码语言:javascript
复制
template<typename Dtype>
class LayerRegistry{
public:
    // 函数指针Creator,返回Layer<Dtype>指针
    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_;
    }

    // Adds a creator.
    static void AddCreator(const string& type, Creator creator) {
        CreatorRegistry& registry = Registry();
        LOG(INFO) << "AddCreator: " << type;
        registry[type] = creator;
    }

    // Get a layer using a LayerParameter.
    static shared_ptr<Layer<Dtype> > CreateLayer(const LayerParameter& param) {

        const string& type = param.type();
        CreatorRegistry& registry = Registry();

        CHECK_EQ(registry.count(type), 1) << "Unknown layer type: ";
        return registry[type](param);
    }
private:
    // Layer registry should never be instantiated
    // everything is done with its static variables.
    LayerRegistry() {}
};

结合宏定义以及模板特化创建的对应的注册类:

代码语言:javascript
复制
template <typename Dtype>
class LayerRegisterer {
public:
    LayerRegisterer(const string& type,
                  shared_ptr<Layer<Dtype>>(*creator)(const LayerParameter&))
    {
        LayerRegistry<Dtype>::AddCreator(type, 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>)    \

#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)
    
}

使用如下,例如输入层:

代码语言:javascript
复制
INSTANTIATE_CLASS(InputLayer);
REGISTER_LAYER_CLASS(Input);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年10月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档