summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d316628)
raw | patch | inline | side by side (parent: d316628)
author | Yangqing Jia <jiayq@google.com> | |
Fri, 26 Sep 2014 23:17:04 +0000 (16:17 -0700) | ||
committer | Yangqing Jia <jiayq84@gmail.com> | |
Mon, 29 Sep 2014 00:45:10 +0000 (17:45 -0700) |
include/caffe/layer_factory.hpp | patch | blob | history | |
src/caffe/layer_factory.cpp | patch | blob | history |
index 08e3e6d3ad8c830bc4f10fa61e85eeb04bd4ac19..a2c4ab56a89e495235fb8546b048a636654f2ab8 100644 (file)
+// This file defines a layer factory that allows one to register layers. During
+// runtime, registered layers could be called by passing a LayerParameter:
+// LayerRegistry<Dtype>::CreateLayer(param);
+//
+// There are two ways to register a layer. Assuming that we have a layer like:
+//
+// template <typename Dtype>
+// class MyAwesomeLayer : public Layer<Dtype> {
+// // your implementations
+// };
+//
+// and its type is defined in the protobuffer as
+//
+// enum LayerType {
+// // other definitions
+// AWESOME = 46,
+// }
+//
+// If the layer is going to be created simply by its constructor, in your c++
+// file, add the following line:
+//
+// REGISTER_LAYER_CLASS(AWESOME, MyAwesomeLayer);
+//
+// Or, if the layer is going to be created by another creator function, in the
+// format of:
+//
+// template <typename Dtype>
+// Layer<Dtype*> GetMyAwesomeLayer(const LayerParameter& param) {
+// // your implementation
+// }
+//
+// (for example, when your layer has multiple backends, see GetConvolutionLayer
+// for a use case), then you can register the creator function instead, like
+//
+// REGISTER_LAYER_CREATOR(AWESOME, GetMyAwesomeLayer)
+//
+// Note that each layer type should only be registered once.
+
#ifndef CAFFE_LAYER_FACTORY_H_
#define CAFFE_LAYER_FACTORY_H_
};
-#define REGISTER_LAYER_CREATOR(type, creator, classname) \
- static LayerRegisterer<float> g_creator_f_##classname(type, creator<float>); \
- static LayerRegisterer<double> g_creator_d_##classname(type, creator<double>)
+#define REGISTER_LAYER_CREATOR(type, creator) \
+ static LayerRegisterer<float> g_creator_f_##type( \
+ LayerParameter_LayerType_##type, creator<float>); \
+ static LayerRegisterer<double> g_creator_d_##type( \
+ LayerParameter_LayerType_##type, creator<double>)
#define REGISTER_LAYER_CLASS(type, clsname) \
template <typename Dtype> \
return new clsname<Dtype>(param); \
} \
static LayerRegisterer<float> g_creator_f_##clsname( \
- type, Creator_##clsname<float>); \
+ LayerParameter_LayerType_##type, Creator_##clsname<float>); \
static LayerRegisterer<double> g_creator_d_##clsname( \
- type, Creator_##clsname<double>)
+ LayerParameter_LayerType_##type, Creator_##clsname<double>)
// A function to get a specific layer from the specification given in
// LayerParameter. Ideally this would be replaced by a factory pattern,
index 79a732b965b601acc0d8dc7af739304dbdd61fb1..b60b3b6fdb7d7f05b811f06d7aafdc421d4d8e24 100644 (file)
}
// Layers that have a specific creator function.
-REGISTER_LAYER_CREATOR(LayerParameter_LayerType_CONVOLUTION,
- GetConvolutionLayer, ConvolutionLayer);
-REGISTER_LAYER_CREATOR(LayerParameter_LayerType_POOLING,
- GetPoolingLayer, PoolingLayer);
-REGISTER_LAYER_CREATOR(LayerParameter_LayerType_RELU,
- GetReLULayer, ReLULayer);
-REGISTER_LAYER_CREATOR(LayerParameter_LayerType_SIGMOID,
- GetSigmoidLayer, SigmoidLayer);
-REGISTER_LAYER_CREATOR(LayerParameter_LayerType_SOFTMAX,
- GetSoftmaxLayer, SoftmaxLayer);
-REGISTER_LAYER_CREATOR(LayerParameter_LayerType_TANH,
- GetTanHLayer, TanHLayer);
+REGISTER_LAYER_CREATOR(CONVOLUTION, GetConvolutionLayer);
+REGISTER_LAYER_CREATOR(POOLING, GetPoolingLayer);
+REGISTER_LAYER_CREATOR(RELU, GetReLULayer);
+REGISTER_LAYER_CREATOR(SIGMOID, GetSigmoidLayer);
+REGISTER_LAYER_CREATOR(SOFTMAX, GetSoftmaxLayer);
+REGISTER_LAYER_CREATOR(TANH, GetTanHLayer);
+
// Layers that use their constructor as their default creator.
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_ACCURACY, AccuracyLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_ABSVAL, AbsValLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_ARGMAX, ArgMaxLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_BNLL, BNLLLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_CONCAT, ConcatLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_CONTRASTIVE_LOSS,
- ContrastiveLossLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_DATA, DataLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_DROPOUT, DropoutLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_DUMMY_DATA, DummyDataLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_EUCLIDEAN_LOSS,
- EuclideanLossLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_ELTWISE, EltwiseLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_FLATTEN, FlattenLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_HDF5_DATA, HDF5DataLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_HDF5_OUTPUT, HDF5OutputLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_HINGE_LOSS, HingeLossLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_IMAGE_DATA, ImageDataLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_IM2COL, Im2colLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_INFOGAIN_LOSS, InfogainLossLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_INNER_PRODUCT, InnerProductLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_LRN, LRNLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_MEMORY_DATA, MemoryDataLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_MVN, MVNLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS,
- MultinomialLogisticLossLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_POWER, PowerLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_SILENCE, SilenceLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS,
- SigmoidCrossEntropyLossLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_SLICE, SliceLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_SOFTMAX_LOSS,
- SoftmaxWithLossLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_SPLIT, SplitLayer);
-REGISTER_LAYER_CLASS(LayerParameter_LayerType_WINDOW_DATA, WindowDataLayer);
+REGISTER_LAYER_CLASS(ACCURACY, AccuracyLayer);
+REGISTER_LAYER_CLASS(ABSVAL, AbsValLayer);
+REGISTER_LAYER_CLASS(ARGMAX, ArgMaxLayer);
+REGISTER_LAYER_CLASS(BNLL, BNLLLayer);
+REGISTER_LAYER_CLASS(CONCAT, ConcatLayer);
+REGISTER_LAYER_CLASS(CONTRASTIVE_LOSS, ContrastiveLossLayer);
+REGISTER_LAYER_CLASS(DATA, DataLayer);
+REGISTER_LAYER_CLASS(DROPOUT, DropoutLayer);
+REGISTER_LAYER_CLASS(DUMMY_DATA, DummyDataLayer);
+REGISTER_LAYER_CLASS(EUCLIDEAN_LOSS, EuclideanLossLayer);
+REGISTER_LAYER_CLASS(ELTWISE, EltwiseLayer);
+REGISTER_LAYER_CLASS(FLATTEN, FlattenLayer);
+REGISTER_LAYER_CLASS(HDF5_DATA, HDF5DataLayer);
+REGISTER_LAYER_CLASS(HDF5_OUTPUT, HDF5OutputLayer);
+REGISTER_LAYER_CLASS(HINGE_LOSS, HingeLossLayer);
+REGISTER_LAYER_CLASS(IMAGE_DATA, ImageDataLayer);
+REGISTER_LAYER_CLASS(IM2COL, Im2colLayer);
+REGISTER_LAYER_CLASS(INFOGAIN_LOSS, InfogainLossLayer);
+REGISTER_LAYER_CLASS(INNER_PRODUCT, InnerProductLayer);
+REGISTER_LAYER_CLASS(LRN, LRNLayer);
+REGISTER_LAYER_CLASS(MEMORY_DATA, MemoryDataLayer);
+REGISTER_LAYER_CLASS(MVN, MVNLayer);
+REGISTER_LAYER_CLASS(MULTINOMIAL_LOGISTIC_LOSS, MultinomialLogisticLossLayer);
+REGISTER_LAYER_CLASS(POWER, PowerLayer);
+REGISTER_LAYER_CLASS(SILENCE, SilenceLayer);
+REGISTER_LAYER_CLASS(SIGMOID_CROSS_ENTROPY_LOSS, SigmoidCrossEntropyLossLayer);
+REGISTER_LAYER_CLASS(SLICE, SliceLayer);
+REGISTER_LAYER_CLASS(SOFTMAX_LOSS, SoftmaxWithLossLayer);
+REGISTER_LAYER_CLASS(SPLIT, SplitLayer);
+REGISTER_LAYER_CLASS(WINDOW_DATA, WindowDataLayer);
} // namespace caffe