#ifndef CAFFE_LRN_LAYER_HPP_ #define CAFFE_LRN_LAYER_HPP_ #include #include "caffe/blob.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/layers/eltwise_layer.hpp" #include "caffe/layers/pooling_layer.hpp" #include "caffe/layers/power_layer.hpp" #include "caffe/layers/split_layer.hpp" namespace caffe { /** * @brief Normalize the input in a local region across or within feature maps. * * TODO(dox): thorough documentation for Forward, Backward, and proto params. */ template class LRNLayer : public Layer { public: explicit LRNLayer(const LayerParameter& param) : Layer(param) {} virtual void LayerSetUp(const vector*>& bottom, const vector*>& top); virtual void Reshape(const vector*>& bottom, const vector*>& top); virtual inline const char* type() const { return "LRN"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } protected: virtual void Forward_cpu(const vector*>& bottom, const vector*>& top); virtual void Forward_gpu(const vector*>& bottom, const vector*>& top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom); virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom); virtual void CrossChannelForward_cpu(const vector*>& bottom, const vector*>& top); virtual void CrossChannelForward_gpu(const vector*>& bottom, const vector*>& top); virtual void WithinChannelForward(const vector*>& bottom, const vector*>& top); virtual void CrossChannelBackward_cpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom); virtual void CrossChannelBackward_gpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom); virtual void WithinChannelBackward(const vector*>& top, const vector& propagate_down, const vector*>& bottom); int size_; int pre_pad_; Dtype alpha_; Dtype beta_; Dtype k_; int num_; int channels_; int height_; int width_; // Fields used for normalization ACROSS_CHANNELS // scale_ stores the intermediate summing results Blob scale_; // Fields used for normalization WITHIN_CHANNEL shared_ptr > split_layer_; vector*> split_top_vec_; shared_ptr > square_layer_; Blob square_input_; Blob square_output_; vector*> square_bottom_vec_; vector*> square_top_vec_; shared_ptr > pool_layer_; Blob pool_output_; vector*> pool_top_vec_; shared_ptr > power_layer_; Blob power_output_; vector*> power_top_vec_; shared_ptr > product_layer_; Blob product_input_; vector*> product_bottom_vec_; }; } // namespace caffe #endif // CAFFE_LRN_LAYER_HPP_