#ifndef CAFFE_DROPOUT_LAYER_HPP_ #define CAFFE_DROPOUT_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 During training only, sets a random portion of @f$x@f$ to 0, adjusting * the rest of the vector magnitude accordingly. * * @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 = |x| @f$ */ template class DropoutLayer : public NeuronLayer { public: /** * @param param provides DropoutParameter dropout_param, * with DropoutLayer options: * - dropout_ratio (\b optional, default 0.5). * Sets the probability @f$ p @f$ that any given unit is dropped. */ explicit DropoutLayer(const LayerParameter& param) : NeuronLayer(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 "Dropout"; } 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. At training time, we have @f$ * y_{\mbox{train}} = \left\{ * \begin{array}{ll} * \frac{x}{1 - p} & \mbox{if } u > p \\ * 0 & \mbox{otherwise} * \end{array} \right. * @f$, where @f$ u \sim U(0, 1)@f$ is generated independently for each * input at each iteration. At test time, we simply have * @f$ y_{\mbox{test}} = \mathbb{E}[y_{\mbox{train}}] = x @f$. */ 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); /// when divided by UINT_MAX, the randomly generated values @f$u\sim U(0,1)@f$ Blob rand_vec_; /// the probability @f$ p @f$ of dropping any input Dtype threshold_; /// the scale for undropped inputs at train time @f$ 1 / (1 - p) @f$ Dtype scale_; unsigned int uint_thres_; }; } // namespace caffe #endif // CAFFE_DROPOUT_LAYER_HPP_