#include "gtest/gtest.h" #include "caffe/filler.hpp" #include "caffe/test/test_caffe_main.hpp" namespace caffe { template class ConstantFillerTest : public ::testing::Test { protected: ConstantFillerTest() : blob_(new Blob(2, 3, 4, 5)), filler_param_() { filler_param_.set_value(10.); filler_.reset(new ConstantFiller(filler_param_)); filler_->Fill(blob_); } virtual ~ConstantFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; shared_ptr > filler_; }; TYPED_TEST_CASE(ConstantFillerTest, TestDtypes); TYPED_TEST(ConstantFillerTest, TestFill) { EXPECT_TRUE(this->blob_); const int count = this->blob_->count(); const TypeParam* data = this->blob_->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_EQ(data[i], this->filler_param_.value()); } } template class UniformFillerTest : public ::testing::Test { protected: UniformFillerTest() : blob_(new Blob(2, 3, 4, 5)), filler_param_() { filler_param_.set_min(1.); filler_param_.set_max(2.); filler_.reset(new UniformFiller(filler_param_)); filler_->Fill(blob_); } virtual ~UniformFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; shared_ptr > filler_; }; TYPED_TEST_CASE(UniformFillerTest, TestDtypes); TYPED_TEST(UniformFillerTest, TestFill) { EXPECT_TRUE(this->blob_); const int count = this->blob_->count(); const TypeParam* data = this->blob_->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_GE(data[i], this->filler_param_.min()); EXPECT_LE(data[i], this->filler_param_.max()); } } template class PositiveUnitballFillerTest : public ::testing::Test { protected: PositiveUnitballFillerTest() : blob_(new Blob(2, 3, 4, 5)), filler_param_() { filler_.reset(new PositiveUnitballFiller(filler_param_)); filler_->Fill(blob_); } virtual ~PositiveUnitballFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; shared_ptr > filler_; }; TYPED_TEST_CASE(PositiveUnitballFillerTest, TestDtypes); TYPED_TEST(PositiveUnitballFillerTest, TestFill) { EXPECT_TRUE(this->blob_); const int num = this->blob_->num(); const int count = this->blob_->count(); const int dim = count / num; const TypeParam* data = this->blob_->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_GE(data[i], 0); EXPECT_LE(data[i], 1); } for (int i = 0; i < num; ++i) { TypeParam sum = 0; for (int j = 0; j < dim; ++j) { sum += data[i * dim + j]; } EXPECT_GE(sum, 0.999); EXPECT_LE(sum, 1.001); } } template class GaussianFillerTest : public ::testing::Test { protected: GaussianFillerTest() : blob_(new Blob(2, 3, 4, 5)), filler_param_() { filler_param_.set_mean(10.); filler_param_.set_std(0.1); filler_.reset(new GaussianFiller(filler_param_)); filler_->Fill(blob_); } virtual ~GaussianFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; shared_ptr > filler_; }; TYPED_TEST_CASE(GaussianFillerTest, TestDtypes); TYPED_TEST(GaussianFillerTest, TestFill) { EXPECT_TRUE(this->blob_); const int count = this->blob_->count(); const TypeParam* data = this->blob_->cpu_data(); TypeParam mean = 0.; TypeParam var = 0.; for (int i = 0; i < count; ++i) { mean += data[i]; var += (data[i] - this->filler_param_.mean()) * (data[i] - this->filler_param_.mean()); } mean /= count; var /= count; // Very loose test. EXPECT_GE(mean, this->filler_param_.mean() - this->filler_param_.std() * 5); EXPECT_LE(mean, this->filler_param_.mean() + this->filler_param_.std() * 5); TypeParam target_var = this->filler_param_.std() * this->filler_param_.std(); EXPECT_GE(var, target_var / 5.); EXPECT_LE(var, target_var * 5.); } template class XavierFillerTest : public ::testing::Test { protected: XavierFillerTest() : blob_(new Blob(1000, 2, 4, 5)), filler_param_() { } virtual void test_params(FillerParameter_VarianceNorm variance_norm, Dtype n) { this->filler_param_.set_variance_norm(variance_norm); this->filler_.reset(new XavierFiller(this->filler_param_)); this->filler_->Fill(blob_); EXPECT_TRUE(this->blob_); const int count = this->blob_->count(); const Dtype* data = this->blob_->cpu_data(); Dtype mean = 0.; Dtype ex2 = 0.; for (int i = 0; i < count; ++i) { mean += data[i]; ex2 += data[i] * data[i]; } mean /= count; ex2 /= count; Dtype std = sqrt(ex2 - mean*mean); Dtype target_std = sqrt(2.0 / n); EXPECT_NEAR(mean, 0.0, 0.1); EXPECT_NEAR(std, target_std, 0.1); } virtual ~XavierFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; shared_ptr > filler_; }; TYPED_TEST_CASE(XavierFillerTest, TestDtypes); TYPED_TEST(XavierFillerTest, TestFillFanIn) { TypeParam n = 2*4*5; this->test_params(FillerParameter_VarianceNorm_FAN_IN, n); } TYPED_TEST(XavierFillerTest, TestFillFanOut) { TypeParam n = 1000*4*5; this->test_params(FillerParameter_VarianceNorm_FAN_OUT, n); } TYPED_TEST(XavierFillerTest, TestFillAverage) { TypeParam n = (2*4*5 + 1000*4*5) / 2.0; this->test_params(FillerParameter_VarianceNorm_AVERAGE, n); } template class MSRAFillerTest : public ::testing::Test { protected: MSRAFillerTest() : blob_(new Blob(1000, 2, 4, 5)), filler_param_() { } virtual void test_params(FillerParameter_VarianceNorm variance_norm, Dtype n) { this->filler_param_.set_variance_norm(variance_norm); this->filler_.reset(new MSRAFiller(this->filler_param_)); this->filler_->Fill(blob_); EXPECT_TRUE(this->blob_); const int count = this->blob_->count(); const Dtype* data = this->blob_->cpu_data(); Dtype mean = 0.; Dtype ex2 = 0.; for (int i = 0; i < count; ++i) { mean += data[i]; ex2 += data[i] * data[i]; } mean /= count; ex2 /= count; Dtype std = sqrt(ex2 - mean*mean); Dtype target_std = sqrt(2.0 / n); EXPECT_NEAR(mean, 0.0, 0.1); EXPECT_NEAR(std, target_std, 0.1); } virtual ~MSRAFillerTest() { delete blob_; } Blob* const blob_; FillerParameter filler_param_; shared_ptr > filler_; }; TYPED_TEST_CASE(MSRAFillerTest, TestDtypes); TYPED_TEST(MSRAFillerTest, TestFillFanIn) { TypeParam n = 2*4*5; this->test_params(FillerParameter_VarianceNorm_FAN_IN, n); } TYPED_TEST(MSRAFillerTest, TestFillFanOut) { TypeParam n = 1000*4*5; this->test_params(FillerParameter_VarianceNorm_FAN_OUT, n); } TYPED_TEST(MSRAFillerTest, TestFillAverage) { TypeParam n = (2*4*5 + 1000*4*5) / 2.0; this->test_params(FillerParameter_VarianceNorm_AVERAGE, n); } template class BilinearFillerTest : public ::testing::Test { protected: BilinearFillerTest() : filler_param_() {} virtual void test_params(const int n) { this->blob_ = new Blob(1000, 2, n, n); this->filler_.reset(new BilinearFiller(this->filler_param_)); this->filler_->Fill(blob_); EXPECT_TRUE(this->blob_); const int outer_num = this->blob_->count(0, 2); const int inner_num = this->blob_->count(2, 4); const Dtype* data = this->blob_->cpu_data(); int f = ceil(this->blob_->width() / 2.); Dtype c = (this->blob_->width() - 1) / (2. * f); for (int i = 0; i < outer_num; ++i) { for (int j = 0; j < inner_num; ++j) { Dtype x = j % this->blob_->width(); Dtype y = (j / this->blob_->width()) % this->blob_->height(); Dtype expected_value = (1 - fabs(x / f - c)) * (1 - fabs(y / f - c)); const Dtype actual_value = data[i * inner_num + j]; EXPECT_NEAR(expected_value, actual_value, 0.01); } } } virtual ~BilinearFillerTest() { delete blob_; } Blob* blob_; FillerParameter filler_param_; shared_ptr > filler_; }; TYPED_TEST_CASE(BilinearFillerTest, TestDtypes); TYPED_TEST(BilinearFillerTest, TestFillOdd) { const int n = 7; this->test_params(n); } TYPED_TEST(BilinearFillerTest, TestFillEven) { const int n = 6; this->test_params(n); } } // namespace caffe