| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef CAFFE_LAYER_FACTORY_H_ |
| | #define CAFFE_LAYER_FACTORY_H_ |
| |
|
| | #include <map> |
| | #include <string> |
| | #include <vector> |
| |
|
| | #include "caffe/common.hpp" |
| | #include "caffe/layer.hpp" |
| | #include "caffe/proto/caffe.pb.h" |
| |
|
| | namespace caffe { |
| |
|
| | template <typename Dtype> |
| | class Layer; |
| |
|
| | template <typename Dtype> |
| | 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_; |
| | } |
| |
|
| | |
| | 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; |
| | } |
| |
|
| | |
| | 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); |
| | } |
| |
|
| | static vector<string> LayerTypeList() { |
| | CreatorRegistry& registry = Registry(); |
| | vector<string> layer_types; |
| | for (typename CreatorRegistry::iterator iter = registry.begin(); |
| | iter != registry.end(); ++iter) { |
| | layer_types.push_back(iter->first); |
| | } |
| | return layer_types; |
| | } |
| |
|
| | private: |
| | |
| | |
| | LayerRegistry() {} |
| |
|
| | static string LayerTypeListString() { |
| | vector<string> layer_types = LayerTypeList(); |
| | string layer_types_str; |
| | for (vector<string>::iterator iter = layer_types.begin(); |
| | iter != layer_types.end(); ++iter) { |
| | if (iter != layer_types.begin()) { |
| | layer_types_str += ", "; |
| | } |
| | layer_types_str += *iter; |
| | } |
| | return layer_types_str; |
| | } |
| | }; |
| |
|
| |
|
| | 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) |
| |
|
| | } |
| |
|
| | #endif |
| |
|