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);
    }
  }
}
Example #5
0
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);
  }
}