#ifndef CAFFE_ACCURACY_LAYER_HPP_ #define CAFFE_ACCURACY_LAYER_HPP_ #include #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 classification accuracy for a one-of-many * classification task. */ template class AccuracyLayer : public Layer { public: /** * @param param provides AccuracyParameter accuracy_param, * with AccuracyLayer options: * - top_k (\b optional, default 1). * Sets the maximum rank @f$ k @f$ at which a prediction is considered * correct. For example, if @f$ k = 5 @f$, a prediction is counted * correct if the correct label is among the top 5 predicted labels. */ explicit AccuracyLayer(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 "Accuracy"; } virtual inline int ExactNumBottomBlobs() const { return 2; } // If there are two top blobs, then the second blob will contain // accuracies per class. virtual inline int MinTopBlobs() const { return 1; } virtual inline int MaxTopBlobs() const { return 2; } protected: /** * @param bottom input Blob vector (length 2) * -# @f$ (N \times C \times H \times W) @f$ * the predictions @f$ x @f$, a Blob with values in * @f$ [-\infty, +\infty] @f$ indicating the predicted score for each of * the @f$ K = CHW @f$ classes. Each @f$ x_n @f$ is mapped to a predicted * label @f$ \hat{l}_n @f$ given by its maximal index: * @f$ \hat{l}_n = \arg\max\limits_k x_{nk} @f$ * -# @f$ (N \times 1 \times 1 \times 1) @f$ * the labels @f$ l @f$, an integer-valued Blob with values * @f$ l_n \in [0, 1, 2, ..., K - 1] @f$ * indicating the correct class label among the @f$ K @f$ classes * @param top output Blob vector (length 1) * -# @f$ (1 \times 1 \times 1 \times 1) @f$ * the computed accuracy: @f$ * \frac{1}{N} \sum\limits_{n=1}^N \delta\{ \hat{l}_n = l_n \} * @f$, where @f$ * \delta\{\mathrm{condition}\} = \left\{ * \begin{array}{lr} * 1 & \mbox{if condition} \\ * 0 & \mbox{otherwise} * \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 Not implemented -- AccuracyLayer cannot be used as a loss. virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom) { for (int i = 0; i < propagate_down.size(); ++i) { if (propagate_down[i]) { NOT_IMPLEMENTED; } } } virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom); int label_axis_, outer_num_, inner_num_; int top_k_; /// Whether to ignore instances with a certain label. bool has_ignore_label_; /// The label indicating that an instance should be ignored. int ignore_label_; /// Keeps counts of the number of samples per class. Blob nums_buffer_; }; } // namespace caffe #endif // CAFFE_ACCURACY_LAYER_HPP_