TYPED_TEST(AccuracyBinaryLayerTest, TestForwardCPUPerClassWithIgnoreLabel) { LayerParameter layer_param; const TypeParam kIgnoreLabelValue = -1; layer_param.mutable_accuracy_param()->set_ignore_label(kIgnoreLabelValue); AccuracyBinaryLayer<TypeParam> layer(layer_param); // Manually set some labels to the ignore label value (-1). this->blob_bottom_label_->mutable_cpu_data()[2] = kIgnoreLabelValue; this->blob_bottom_label_->mutable_cpu_data()[5] = kIgnoreLabelValue; this->blob_bottom_label_->mutable_cpu_data()[32] = kIgnoreLabelValue; layer.SetUp(this->blob_bottom_vec_, this->blob_top_per_class_vec_); layer.Forward(this->blob_bottom_vec_, this->blob_top_per_class_vec_); TypeParam max_value; int max_id; int num_correct_labels = 0; const int num_class = this->blob_top_per_class_->num(); vector<int> correct_per_class(num_class, 0); vector<int> num_per_class(num_class, 0); int count = 0; for (int i = 0; i < 100; ++i) { if (kIgnoreLabelValue == this->blob_bottom_label_->data_at(i, 0, 0, 0)) { continue; } ++count; /*max_value = -FLT_MAX; max_id = 0; for (int j = 0; j < 10; ++j) { if (this->blob_bottom_data_->data_at(i, j, 0, 0) > max_value) { max_value = this->blob_bottom_data_->data_at(i, j, 0, 0); max_id = j; } }*/ ++num_per_class[this->blob_bottom_label_->data_at(i, 0, 0, 0)]; if (this->blob_bottom_data_->data_at(i * 10 + this->blob_bottom_label_->data_at(i, 0, 0, 0), 0, 0, 0) > this->blob_bottom_data_->data_at(i * 10 + this->blob_bottom_label_->data_at(i, 0, 0, 0), 1, 0, 0)) { ++num_correct_labels; ++correct_per_class[this->blob_bottom_label_->data_at(i, 0, 0, 0)]; } //if (max_id == this->blob_bottom_label_->data_at(i, 0, 0, 0)) { // ++num_correct_labels; // ++correct_per_class[max_id]; //} } EXPECT_EQ(count, 97); EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), num_correct_labels / TypeParam(count), 1e-4); for (int i = 0; i < 10; ++i) { TypeParam accuracy_per_class = (num_per_class[i] > 0 ? static_cast<TypeParam>(correct_per_class[i]) / num_per_class[i] : 0); EXPECT_NEAR(this->blob_top_per_class_->data_at(i, 0, 0, 0), accuracy_per_class, 1e-4); } }
TYPED_TEST(AccuracyLayerTest, TestForwardCPUPerClassWithIgnoreLabel) { LayerParameter layer_param; const TypeParam kIgnoreLabelValue = -1; layer_param.mutable_accuracy_param()->set_ignore_label(kIgnoreLabelValue); AccuracyLayer<TypeParam, TypeParam> layer(layer_param); // Manually set some labels to the ignore label value (-1). this->blob_bottom_label_->mutable_cpu_data()[2] = kIgnoreLabelValue; this->blob_bottom_label_->mutable_cpu_data()[5] = kIgnoreLabelValue; this->blob_bottom_label_->mutable_cpu_data()[32] = kIgnoreLabelValue; layer.SetUp(this->blob_bottom_vec_, this->blob_top_per_class_vec_); layer.Forward(this->blob_bottom_vec_, this->blob_top_per_class_vec_); TypeParam max_value; int max_id; int num_correct_labels = 0; const int num_class = this->blob_top_per_class_->num(); vector<int> correct_per_class(num_class, 0); vector<int> num_per_class(num_class, 0); int count = 0; for (int i = 0; i < 100; ++i) { if (kIgnoreLabelValue == this->blob_bottom_label_->data_at(i, 0, 0, 0)) { continue; } ++count; max_value = - max_dtype<TypeParam>(); max_id = 0; for (int j = 0; j < 10; ++j) { if (this->blob_bottom_data_->data_at(i, j, 0, 0) > max_value) { max_value = this->blob_bottom_data_->data_at(i, j, 0, 0); max_id = j; } } const int id = static_cast<int>(this->blob_bottom_label_->data_at(i, 0, 0, 0)); ++num_per_class[id]; if (max_id == id) { ++num_correct_labels; ++correct_per_class[max_id]; } } EXPECT_EQ(count, 97); EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), static_cast<float>(num_correct_labels) / count, tol<TypeParam>(1e-4, 2e-2)); if (sizeof(TypeParam) >= 4) { for (int i = 0; i < 10; ++i) { TypeParam accuracy_per_class = (num_per_class[i] > 0 ? static_cast<TypeParam>(correct_per_class[i]) / num_per_class[i] : 0); EXPECT_NEAR(this->blob_top_per_class_->data_at(i, 0, 0, 0), accuracy_per_class, 1e-4); } } }
TYPED_TEST(AccuracyBinaryLayerTest, TestForwardCPUPerClass) { LayerParameter layer_param; AccuracyBinaryLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, this->blob_top_per_class_vec_); layer.Forward(this->blob_bottom_vec_, this->blob_top_per_class_vec_); TypeParam max_value; int max_id; int num_correct_labels = 0; const int num_class = this->blob_top_per_class_->num(); vector<int> correct_per_class(num_class, 0); vector<int> num_per_class(num_class, 0); for (int i = 0; i < 100; ++i) { //max_value = -FLT_MAX; //max_id = 0; //for (int j = 0; j < 10; ++j) { // if (this->blob_bottom_data_->data_at(i, j, 0, 0) > max_value) { // max_value = this->blob_bottom_data_->data_at(i, j, 0, 0); // max_id = j; // } //} ++num_per_class[this->blob_bottom_label_->data_at(i, 0, 0, 0)]; if (this->blob_bottom_data_->data_at(i * 10 + this->blob_bottom_label_->data_at(i, 0, 0, 0), 0, 0, 0) > this->blob_bottom_data_->data_at(i * 10 + this->blob_bottom_label_->data_at(i, 0, 0, 0), 1, 0, 0)) { ++num_correct_labels; ++correct_per_class[this->blob_bottom_label_->data_at(i, 0, 0, 0)]; } //if (max_id == this->blob_bottom_label_->data_at(i, 0, 0, 0)) { // ++num_correct_labels; // ++correct_per_class[max_id]; //} } EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), num_correct_labels / 100.0, 1e-4); for (int i = 0; i < num_class; ++i) { TypeParam accuracy_per_class = (num_per_class[i] > 0 ? static_cast<TypeParam>(correct_per_class[i]) / num_per_class[i] : 0); EXPECT_NEAR(this->blob_top_per_class_->data_at(i, 0, 0, 0), accuracy_per_class, 1e-4); } }
TYPED_TEST(AccuracyLayerTest, TestForwardCPUPerClass) { LayerParameter layer_param; AccuracyLayer<TypeParam, TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, this->blob_top_per_class_vec_); layer.Forward(this->blob_bottom_vec_, this->blob_top_per_class_vec_); TypeParam max_value; int max_id; int num_correct_labels = 0; const int num_class = this->blob_top_per_class_->num(); vector<int> correct_per_class(num_class, 0); vector<int> num_per_class(num_class, 0); for (int i = 0; i < 100; ++i) { max_value = - max_dtype<TypeParam>(); max_id = 0; for (int j = 0; j < 10; ++j) { if (this->blob_bottom_data_->data_at(i, j, 0, 0) > max_value) { max_value = this->blob_bottom_data_->data_at(i, j, 0, 0); max_id = j; } } const int id = static_cast<int>(this->blob_bottom_label_->data_at(i, 0, 0, 0)); ++num_per_class[id]; if (max_id == id) { ++num_correct_labels; ++correct_per_class[max_id]; } } EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), num_correct_labels / 100.0, 1e-4); if (sizeof(TypeParam) >= 4) { for (int i = 0; i < num_class; ++i) { TypeParam accuracy_per_class = (num_per_class[i] > 0 ? static_cast<TypeParam>(correct_per_class[i]) / num_per_class[i] : 0); EXPECT_NEAR(this->blob_top_per_class_->data_at(i, 0, 0, 0), accuracy_per_class, 1e-4); } } }
TYPED_TEST(AccuracyLayerTest, TestForwardCPUPerClass) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); AccuracyLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, this->blob_top_per_class_vec_); layer.Forward(this->blob_bottom_vec_, this->blob_top_per_class_vec_); TypeParam max_value; int max_id; int num_correct_labels = 0; const int num_class = this->blob_top_per_class_->num(); vector<int> correct_per_class(num_class, 0); vector<int> num_per_class(num_class, 0); for (int i = 0; i < 100; ++i) { max_value = -FLT_MAX; max_id = 0; for (int j = 0; j < 10; ++j) { if (this->blob_bottom_data_->data_at(i, j, 0, 0) > max_value) { max_value = this->blob_bottom_data_->data_at(i, j, 0, 0); max_id = j; } } ++num_per_class[this->blob_bottom_label_->data_at(i, 0, 0, 0)]; if (max_id == this->blob_bottom_label_->data_at(i, 0, 0, 0)) { ++num_correct_labels; ++correct_per_class[max_id]; } } EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), num_correct_labels / 100.0, 1e-4); for (int i = 0; i < num_class; ++i) { EXPECT_NEAR(this->blob_top_per_class_->data_at(i, 0, 0, 0), static_cast<float>(correct_per_class[i]) / num_per_class[i], 1e-4); } }