text: #ifndef CAFFE_NORMLIZED_MSE_LOSS_LAYER_HPP_
  #define CAFFE_NORMLIZED_MSE_LOSS_LAYER_HPP_
  
  #include <vector>
  
  #include "caffe/blob.hpp"
  #include "caffe/layer.hpp"
  #include "caffe/proto/caffe.pb.h"
  
  #include "caffe/layers/loss_layer.hpp"
  
  namespace caffe {
  
  /**
    * @brief Computes the mean square error of landmarks by normlized inter-ocular distance
   */
  
  template <typename Dtype>
  class NormlizedMSELossLayer : public LossLayer<Dtype> {
   public:
    explicit NormlizedMSELossLayer(const LayerParameter& param)
        : LossLayer<Dtype>(param), diff_() {}
    virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
        const vector<Blob<Dtype>*>& top);
  
    virtual inline const char* type() const { return "NormlizedMSELoss"; }
    /**
     * Unlike most loss layers, in the NormlizedMSELossLayer we can backpropagate
     * to both inputs -- override to return true and always allow force_backward.
     */
    virtual inline bool AllowForceBackward(const int bottom_index) const {
      return true;
    }
  
   protected:
    /// @copydoc NormlizedMSELossLayer
    virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,
        const vector<Blob<Dtype>*>& top);
    // virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom,
    //     const vector<Blob<Dtype>*>& top);
  
    virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
        const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
    // virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
    //     const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
  
    Blob<Dtype> diff_;
  };
  
  }  // namespace caffe
  
  #endif  // CAFFE_NORMLIZED_MSE_LOSS_LAYER_HPP_
  