accuracy_layer
来源:互联网 发布:php xmlreader详解 编辑:程序博客网 时间:2024/06/13 13:00
#include <functional>#include <utility>#include <vector>#include "caffe/layers/accuracy_layer.hpp"#include "caffe/util/math_functions.hpp"namespace caffe {template <typename Dtype>void AccuracyLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { top_k_ = this->layer_param_.accuracy_param().top_k();//获得k,也就是正确类别排前k名算个入acc has_ignore_label_ = this->layer_param_.accuracy_param().has_ignore_label();//有没有要忽略的标签 if (has_ignore_label_) { ignore_label_ = this->layer_param_.accuracy_param().ignore_label(); }}/*定义中关于axis的说明:axis指出在预测blob中,哪一维是label轴,如(N x C x H x W)的blob,axis=0,则N为label对应的维度。axis=1,则C为label对应的维度,而剩下的N为outer样本数量, H x W为inner样本数量。由代码可知,当axis=k时outer_num_=blob.shape[0,..,k),inner_num_=blob.shape[k+1,..,shape.size)。一般的,label blob的维度为(N x C),N为样本数量,C为标签数量(即类别个数)。axis=1,outer_num_=N,inner_num_=shape[2,2)=1(即没有inner)*/template <typename Dtype>void AccuracyLayer<Dtype>::Reshape( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { CHECK_LE(top_k_, bottom[0]->count() / bottom[1]->count())//要取的k不能比总类别数大 << "top_k must be less than or equal to the number of classes."; label_axis_ = bottom[0]->CanonicalAxisIndex(this->layer_param_.accuracy_param().axis());//label的坐标轴 outer_num_ = bottom[0]->count(0, label_axis_);//基本可以理解为batch中的样本数 inner_num_ = bottom[0]->count(label_axis_ + 1);//1 CHECK_EQ(outer_num_ * inner_num_, bottom[1]->count()) << "Number of labels must match number of predictions; " << "e.g., if label axis == 1 and prediction shape is (N, C, H, W), " << "label count (number of labels) must be N*H*W, " << "with integer values in {0, 1, ..., C-1}."; vector<int> top_shape(0); // Accuracy is a scalar; 0 axes. top[0]->Reshape(top_shape);//top[0]是总体样本正确率,标量top[1]为每个类别的正确率,向量 if (top.size() > 1) { // Per-class accuracy is a vector; 1 axes. vector<int> top_shape_per_class(1); top_shape_per_class[0] = bottom[0]->shape(label_axis_); top[1]->Reshape(top_shape_per_class); nums_buffer_.Reshape(top_shape_per_class); }}template <typename Dtype>void AccuracyLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { Dtype accuracy = 0; const Dtype* bottom_data = bottom[0]->cpu_data();//样本数*标签个数(也就是最后一个全链接的输出层节点个数) const Dtype* bottom_label = bottom[1]->cpu_data(); const int dim = bottom[0]->count() / outer_num_; const int num_labels = bottom[0]->shape(label_axis_); vector<Dtype> maxval(top_k_+1); vector<int> max_id(top_k_+1); if (top.size() > 1) { caffe_set(nums_buffer_.count(), Dtype(0), nums_buffer_.mutable_cpu_data()); caffe_set(top[1]->count(), Dtype(0), top[1]->mutable_cpu_data()); } int count = 0; for (int i = 0; i < outer_num_; ++i) {//对于每个样本 for (int j = 0; j < inner_num_; ++j) { const int label_value = static_cast<int>(bottom_label[i * inner_num_ + j]);//第i个样本的label if (has_ignore_label_ && label_value == ignore_label_) {//如果这个类别被忽略就计算下一个。 continue; } if (top.size() > 1) ++nums_buffer_.mutable_cpu_data()[label_value];//batch中每个类别的总样本数,为了计算类内正确率 DCHECK_GE(label_value, 0); DCHECK_LT(label_value, num_labels); // Top-k accuracy std::vector<std::pair<Dtype, int> > bottom_data_vector; for (int k = 0; k < num_labels; ++k) { bottom_data_vector.push_back(std::make_pair( bottom_data[i * dim + k * inner_num_ + j], k));//完成带序号的排序 } std::partial_sort( bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_, bottom_data_vector.end(), std::greater<std::pair<Dtype, int> >()); // check if true label is in top k predictions for (int k = 0; k < top_k_; k++) { if (bottom_data_vector[k].second == label_value) { //如果标定的label在预测的前k个label中 ++accuracy; if (top.size() > 1) ++top[1]->mutable_cpu_data()[label_value]; break; } } ++count; } } // LOG(INFO) << "Accuracy: " << accuracy; top[0]->mutable_cpu_data()[0] = accuracy / count; if (top.size() > 1) { for (int i = 0; i < top[1]->count(); ++i) { top[1]->mutable_cpu_data()[i] = nums_buffer_.cpu_data()[i] == 0 ? 0 //batch中没有某一类样本就把这类样本的正确率设置为0,不然的话就正常计算 : top[1]->cpu_data()[i] / nums_buffer_.cpu_data()[i]; } } // Accuracy layer should not be used as a loss function.}INSTANTIATE_CLASS(AccuracyLayer);REGISTER_LAYER_CLASS(Accuracy);} // namespace caffe
1 0
- accuracy_layer
- caffe accuracy_layer.cpp 解读
- caffe accuracy_layer.cpp 解读
- caffe accuracy_layer.cpp 中的排序 paitial_sort
- 学习笔记: 源码 accuracy_layer.cpp 略明
- vi的基本使用
- 单例模式
- JavaSocket通信--BIO,NIO,AIO
- 记一次PIP执行出错--UnicodeDecodeError: 'ascii' codec can't decode byte 0xb1 in position 9: ordinal
- C++ 如何 int 转 string
- accuracy_layer
- 使用js创建div、添加子div并给div设置在css中定义的class选择属性以及设置style属性
- 自己做的很好用不卡顿的弹幕View
- 如何学习一门计算机语言
- Keil如何提升性能和减小代码大小
- JS在可编辑的div中的光标位置插入内容或表情
- 【索引 index】是个好东西——大幅加快MySQL update更新速度的方法
- 安装Sublime Text 3插件的方法
- mplayer命令行模式下的使用方法