caffe源码分析-layer_factory

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

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

下面简要分析下layer_factory


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() {}
};

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


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

使用如下,例如输入层:


INSTANTIATE_CLASS(InputLayer);
REGISTER_LAYER_CLASS(Input);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值