#ifndef CAFFE_ELU_LAYER_HPP_ #define CAFFE_ELU_LAYER_HPP_ #include #include "caffe/blob.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/layers/neuron_layer.hpp" namespace caffe { /** * @brief Exponential Linear Unit non-linearity @f$ * y = \left\{ * \begin{array}{lr} * x & \mathrm{if} \; x > 0 \\ * \alpha (\exp(x)-1) & \mathrm{if} \; x \le 0 * \end{array} \right. * @f$. */ template class ELULayer : public NeuronLayer { public: /** * @param param provides ELUParameter elu_param, * with ELULayer options: * - alpha (\b optional, default 1). * the value @f$ \alpha @f$ by which controls saturation for negative inputs. */ explicit ELULayer(const LayerParameter& param) : NeuronLayer(param) {} virtual inline const char* type() const { return "ELU"; } protected: /** * @param bottom input Blob vector (length 1) * -# @f$ (N \times C \times H \times W) @f$ * the inputs @f$ x @f$ * @param top output Blob vector (length 1) * -# @f$ (N \times C \times H \times W) @f$ * the computed outputs @f$ * y = \left\{ * \begin{array}{lr} * x & \mathrm{if} \; x > 0 \\ * \alpha (\exp(x)-1) & \mathrm{if} \; x \le 0 * \end{array} \right. * @f$. */ virtual void Forward_cpu(const vector*>& bottom, const vector*>& top); virtual void Forward_gpu(const vector*>& bottom, const vector*>& top); /** * @brief Computes the error gradient w.r.t. the ELU inputs. * * @param top output Blob vector (length 1), providing the error gradient with * respect to the outputs * -# @f$ (N \times C \times H \times W) @f$ * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ * with respect to computed outputs @f$ y @f$ * @param propagate_down see Layer::Backward. * @param bottom input Blob vector (length 1) * -# @f$ (N \times C \times H \times W) @f$ * the inputs @f$ x @f$; Backward fills their diff with * gradients @f$ * \frac{\partial E}{\partial x} = \left\{ * \begin{array}{lr} * 1 & \mathrm{if} \; x > 0 \\ * y + \alpha & \mathrm{if} \; x \le 0 * \end{array} \right. * @f$ if propagate_down[0]. */ 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); }; } // namespace caffe #endif // CAFFE_ELU_LAYER_HPP_