summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoiredd <snowball91b@gmail.com>2018-03-08 14:02:10 +0100
committerWook Song <wook16.song@samsung.com>2020-01-23 22:50:36 +0900
commit9d5c8a41e9ffee44c58c0949c22380eb6a8d39b1 (patch)
treeb5b91153230d355de68ff263649bc4ea1dde5992
parentb4de38ad7530dffcee3c3a002acb36f189be0fb5 (diff)
downloadcaffe-9d5c8a41e9ffee44c58c0949c22380eb6a8d39b1.tar.gz
caffe-9d5c8a41e9ffee44c58c0949c22380eb6a8d39b1.tar.bz2
caffe-9d5c8a41e9ffee44c58c0949c22380eb6a8d39b1.zip
Filler testing overhaul
-rw-r--r--src/caffe/test/test_filler.cpp403
1 files changed, 331 insertions, 72 deletions
diff --git a/src/caffe/test/test_filler.cpp b/src/caffe/test/test_filler.cpp
index f84d707b..3ecec37a 100644
--- a/src/caffe/test/test_filler.cpp
+++ b/src/caffe/test/test_filler.cpp
@@ -1,3 +1,5 @@
+#include <vector>
+
#include "gtest/gtest.h"
#include "caffe/filler.hpp"
@@ -10,11 +12,20 @@ template <typename Dtype>
class ConstantFillerTest : public ::testing::Test {
protected:
ConstantFillerTest()
- : blob_(new Blob<Dtype>(2, 3, 4, 5)),
+ : blob_(new Blob<Dtype>()),
filler_param_() {
filler_param_.set_value(10.);
filler_.reset(new ConstantFiller<Dtype>(filler_param_));
+ }
+ virtual void test_params(const vector<int>& shape) {
+ EXPECT_TRUE(blob_);
+ blob_->Reshape(shape);
filler_->Fill(blob_);
+ const int count = blob_->count();
+ const Dtype* data = blob_->cpu_data();
+ for (int i = 0; i < count; ++i) {
+ EXPECT_EQ(data[i], filler_param_.value());
+ }
}
virtual ~ConstantFillerTest() { delete blob_; }
Blob<Dtype>* const blob_;
@@ -25,12 +36,34 @@ class ConstantFillerTest : public ::testing::Test {
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());
- }
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(ConstantFillerTest, TestFill1D) {
+ vector<int> blob_shape(1, 15);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(ConstantFillerTest, TestFill2D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(8);
+ blob_shape.push_back(3);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(ConstantFillerTest, TestFill5D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ blob_shape.push_back(2);
+ this->test_params(blob_shape);
}
@@ -38,12 +71,22 @@ template <typename Dtype>
class UniformFillerTest : public ::testing::Test {
protected:
UniformFillerTest()
- : blob_(new Blob<Dtype>(2, 3, 4, 5)),
+ : blob_(new Blob<Dtype>()),
filler_param_() {
filler_param_.set_min(1.);
filler_param_.set_max(2.);
filler_.reset(new UniformFiller<Dtype>(filler_param_));
+ }
+ virtual void test_params(const vector<int>& shape) {
+ EXPECT_TRUE(blob_);
+ blob_->Reshape(shape);
filler_->Fill(blob_);
+ const int count = blob_->count();
+ const Dtype* data = blob_->cpu_data();
+ for (int i = 0; i < count; ++i) {
+ EXPECT_GE(data[i], filler_param_.min());
+ EXPECT_LE(data[i], filler_param_.max());
+ }
}
virtual ~UniformFillerTest() { delete blob_; }
Blob<Dtype>* const blob_;
@@ -54,23 +97,64 @@ class UniformFillerTest : public ::testing::Test {
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());
- }
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(UniformFillerTest, TestFill1D) {
+ vector<int> blob_shape(1, 15);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(UniformFillerTest, TestFill2D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(8);
+ blob_shape.push_back(3);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(UniformFillerTest, TestFill5D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ blob_shape.push_back(2);
+ this->test_params(blob_shape);
}
template <typename Dtype>
class PositiveUnitballFillerTest : public ::testing::Test {
protected:
PositiveUnitballFillerTest()
- : blob_(new Blob<Dtype>(2, 3, 4, 5)),
+ : blob_(new Blob<Dtype>()),
filler_param_() {
filler_.reset(new PositiveUnitballFiller<Dtype>(filler_param_));
+ }
+ virtual void test_params(const vector<int>& shape) {
+ EXPECT_TRUE(blob_);
+ blob_->Reshape(shape);
filler_->Fill(blob_);
+ const int num = blob_->shape(0);
+ const int count = blob_->count();
+ const int dim = count / num;
+ const Dtype* data = 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) {
+ Dtype sum = Dtype(0);
+ for (int j = 0; j < dim; ++j) {
+ sum += data[i * dim + j];
+ }
+ EXPECT_GE(sum, 0.999);
+ EXPECT_LE(sum, 1.001);
+ }
}
virtual ~PositiveUnitballFillerTest() { delete blob_; }
Blob<Dtype>* const blob_;
@@ -81,35 +165,78 @@ class PositiveUnitballFillerTest : public ::testing::Test {
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);
- }
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(PositiveUnitballFillerTest, TestFill1D) {
+ vector<int> blob_shape(1, 15);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(PositiveUnitballFillerTest, TestFill2D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(8);
+ blob_shape.push_back(3);
+ this->test_params(blob_shape);
+}
+
+TYPED_TEST(PositiveUnitballFillerTest, TestFill5D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ blob_shape.push_back(2);
+ this->test_params(blob_shape);
}
template <typename Dtype>
class GaussianFillerTest : public ::testing::Test {
protected:
GaussianFillerTest()
- : blob_(new Blob<Dtype>(2, 3, 4, 5)),
+ : blob_(new Blob<Dtype>()),
filler_param_() {
filler_param_.set_mean(10.);
filler_param_.set_std(0.1);
filler_.reset(new GaussianFiller<Dtype>(filler_param_));
+ }
+ virtual void test_params(const vector<int>& shape,
+ const Dtype tolerance = Dtype(5), const int repetitions = 100) {
+ // Tests for statistical properties should be ran multiple times.
+ EXPECT_TRUE(blob_);
+ blob_->Reshape(shape);
+ for (int i = 0; i < repetitions; ++i) {
+ test_params_iter(shape, tolerance);
+ }
+ }
+ virtual void test_params_iter(const vector<int>& shape,
+ const Dtype tolerance) {
+ // This test has a configurable tolerance parameter - by default it was
+ // equal to 5.0 which is very loose - allowing some tuning (e.g. for tests
+ // on smaller blobs the actual variance will be larger than desired, so the
+ // tolerance can be increased to account for that).
filler_->Fill(blob_);
+ const int count = blob_->count();
+ const Dtype* data = blob_->cpu_data();
+ Dtype mean = Dtype(0);
+ Dtype var = Dtype(0);
+ for (int i = 0; i < count; ++i) {
+ mean += data[i];
+ var += data[i] * data[i];
+ }
+ mean /= count;
+ var /= count;
+ var -= mean*mean;
+ EXPECT_GE(mean, filler_param_.mean() - filler_param_.std() * tolerance);
+ EXPECT_LE(mean, filler_param_.mean() + filler_param_.std() * tolerance);
+ Dtype target_var = filler_param_.std() * filler_param_.std();
+ EXPECT_GE(var, target_var / tolerance);
+ EXPECT_LE(var, target_var * tolerance);
}
virtual ~GaussianFillerTest() { delete blob_; }
Blob<Dtype>* const blob_;
@@ -120,41 +247,62 @@ class GaussianFillerTest : public ::testing::Test {
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.);
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ const TypeParam tolerance = TypeParam(3); // enough for a 120-element blob
+ this->test_params(blob_shape, tolerance);
+}
+
+TYPED_TEST(GaussianFillerTest, TestFill1D) {
+ vector<int> blob_shape(1, 25);
+ const TypeParam tolerance = TypeParam(5);
+ this->test_params(blob_shape, tolerance);
+}
+
+TYPED_TEST(GaussianFillerTest, TestFill2D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(8);
+ blob_shape.push_back(3);
+ const TypeParam tolerance = TypeParam(5);
+ this->test_params(blob_shape, tolerance);
+}
+
+TYPED_TEST(GaussianFillerTest, TestFill5D) {
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ blob_shape.push_back(2);
+ const TypeParam tolerance = TypeParam(2);
+ this->test_params(blob_shape, tolerance);
}
template <typename Dtype>
class XavierFillerTest : public ::testing::Test {
protected:
XavierFillerTest()
- : blob_(new Blob<Dtype>(1000, 2, 4, 5)),
+ : blob_(new Blob<Dtype>()),
filler_param_() {
}
virtual void test_params(FillerParameter_VarianceNorm variance_norm,
+ Dtype n, const vector<int>& shape, const int repetitions = 100) {
+ EXPECT_TRUE(blob_);
+ blob_->Reshape(shape);
+ for (int i = 0; i < repetitions; ++i) {
+ test_params_iter(variance_norm, n);
+ }
+ }
+ virtual void test_params_iter(FillerParameter_VarianceNorm variance_norm,
Dtype n) {
- this->filler_param_.set_variance_norm(variance_norm);
- this->filler_.reset(new XavierFiller<Dtype>(this->filler_param_));
- this->filler_->Fill(blob_);
- EXPECT_TRUE(this->blob_);
- const int count = this->blob_->count();
- const Dtype* data = this->blob_->cpu_data();
+ filler_param_.set_variance_norm(variance_norm);
+ filler_.reset(new XavierFiller<Dtype>(filler_param_));
+ filler_->Fill(blob_);
+ const int count = blob_->count();
+ const Dtype* data = blob_->cpu_data();
Dtype mean = 0.;
Dtype ex2 = 0.;
for (int i = 0; i < count; ++i) {
@@ -177,33 +325,92 @@ class XavierFillerTest : public ::testing::Test {
TYPED_TEST_CASE(XavierFillerTest, TestDtypes);
TYPED_TEST(XavierFillerTest, TestFillFanIn) {
+ vector<int> blob_shape;
+ blob_shape.push_back(1000);
+ blob_shape.push_back(2);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
TypeParam n = 2*4*5;
- this->test_params(FillerParameter_VarianceNorm_FAN_IN, n);
+ this->test_params(FillerParameter_VarianceNorm_FAN_IN, n, blob_shape);
}
+
TYPED_TEST(XavierFillerTest, TestFillFanOut) {
+ vector<int> blob_shape;
+ blob_shape.push_back(1000);
+ blob_shape.push_back(2);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
TypeParam n = 1000*4*5;
- this->test_params(FillerParameter_VarianceNorm_FAN_OUT, n);
+ this->test_params(FillerParameter_VarianceNorm_FAN_OUT, n, blob_shape);
}
+
TYPED_TEST(XavierFillerTest, TestFillAverage) {
+ vector<int> blob_shape;
+ blob_shape.push_back(1000);
+ blob_shape.push_back(2);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
TypeParam n = (2*4*5 + 1000*4*5) / 2.0;
- this->test_params(FillerParameter_VarianceNorm_AVERAGE, n);
+ this->test_params(FillerParameter_VarianceNorm_AVERAGE, n, blob_shape);
+}
+
+TYPED_TEST(XavierFillerTest, TestFill1D) {
+ // This makes little sense but at least we will know that we can fill it
+ EXPECT_TRUE(this->blob_);
+ vector<int> blob_shape(1, 25);
+ this->blob_->Reshape(blob_shape);
+ this->filler_param_.set_variance_norm(FillerParameter_VarianceNorm_AVERAGE);
+ this->filler_.reset(new XavierFiller<TypeParam>(this->filler_param_));
+ this->filler_->Fill(this->blob_);
+}
+
+TYPED_TEST(XavierFillerTest, TestFill2D) {
+ EXPECT_TRUE(this->blob_);
+ vector<int> blob_shape;
+ blob_shape.push_back(8);
+ blob_shape.push_back(3);
+ this->blob_->Reshape(blob_shape);
+ this->filler_param_.set_variance_norm(FillerParameter_VarianceNorm_AVERAGE);
+ this->filler_.reset(new XavierFiller<TypeParam>(this->filler_param_));
+ this->filler_->Fill(this->blob_);
+}
+
+TYPED_TEST(XavierFillerTest, TestFill5D) {
+ EXPECT_TRUE(this->blob_);
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ blob_shape.push_back(2);
+ this->blob_->Reshape(blob_shape);
+ this->filler_param_.set_variance_norm(FillerParameter_VarianceNorm_AVERAGE);
+ this->filler_.reset(new XavierFiller<TypeParam>(this->filler_param_));
+ this->filler_->Fill(this->blob_);
}
template <typename Dtype>
class MSRAFillerTest : public ::testing::Test {
protected:
MSRAFillerTest()
- : blob_(new Blob<Dtype>(1000, 2, 4, 5)),
+ : blob_(new Blob<Dtype>()),
filler_param_() {
}
virtual void test_params(FillerParameter_VarianceNorm variance_norm,
+ Dtype n, const vector<int>& shape, const int repetitions = 100) {
+ EXPECT_TRUE(blob_);
+ blob_->Reshape(shape);
+ for (int i = 0; i < repetitions; ++i) {
+ test_params_iter(variance_norm, n);
+ }
+ }
+ virtual void test_params_iter(FillerParameter_VarianceNorm variance_norm,
Dtype n) {
- this->filler_param_.set_variance_norm(variance_norm);
- this->filler_.reset(new MSRAFiller<Dtype>(this->filler_param_));
- this->filler_->Fill(blob_);
- EXPECT_TRUE(this->blob_);
- const int count = this->blob_->count();
- const Dtype* data = this->blob_->cpu_data();
+ filler_param_.set_variance_norm(variance_norm);
+ filler_.reset(new MSRAFiller<Dtype>(filler_param_));
+ filler_->Fill(blob_);
+ const int count = blob_->count();
+ const Dtype* data = blob_->cpu_data();
Dtype mean = 0.;
Dtype ex2 = 0.;
for (int i = 0; i < count; ++i) {
@@ -226,16 +433,68 @@ class MSRAFillerTest : public ::testing::Test {
TYPED_TEST_CASE(MSRAFillerTest, TestDtypes);
TYPED_TEST(MSRAFillerTest, TestFillFanIn) {
+ vector<int> blob_shape;
+ blob_shape.push_back(1000);
+ blob_shape.push_back(2);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
TypeParam n = 2*4*5;
- this->test_params(FillerParameter_VarianceNorm_FAN_IN, n);
+ this->test_params(FillerParameter_VarianceNorm_FAN_IN, n, blob_shape);
}
+
TYPED_TEST(MSRAFillerTest, TestFillFanOut) {
+ vector<int> blob_shape;
+ blob_shape.push_back(1000);
+ blob_shape.push_back(2);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
TypeParam n = 1000*4*5;
- this->test_params(FillerParameter_VarianceNorm_FAN_OUT, n);
+ this->test_params(FillerParameter_VarianceNorm_FAN_OUT, n, blob_shape);
}
+
TYPED_TEST(MSRAFillerTest, TestFillAverage) {
+ vector<int> blob_shape;
+ blob_shape.push_back(1000);
+ blob_shape.push_back(2);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
TypeParam n = (2*4*5 + 1000*4*5) / 2.0;
- this->test_params(FillerParameter_VarianceNorm_AVERAGE, n);
+ this->test_params(FillerParameter_VarianceNorm_AVERAGE, n, blob_shape);
+}
+
+TYPED_TEST(MSRAFillerTest, TestFill1D) {
+ // Like with Xavier - no checking for correctness, just if it can be filled.
+ EXPECT_TRUE(this->blob_);
+ vector<int> blob_shape(1, 25);
+ this->blob_->Reshape(blob_shape);
+ this->filler_param_.set_variance_norm(FillerParameter_VarianceNorm_AVERAGE);
+ this->filler_.reset(new MSRAFiller<TypeParam>(this->filler_param_));
+ this->filler_->Fill(this->blob_);
+}
+
+TYPED_TEST(MSRAFillerTest, TestFill2D) {
+ EXPECT_TRUE(this->blob_);
+ vector<int> blob_shape;
+ blob_shape.push_back(8);
+ blob_shape.push_back(3);
+ this->blob_->Reshape(blob_shape);
+ this->filler_param_.set_variance_norm(FillerParameter_VarianceNorm_AVERAGE);
+ this->filler_.reset(new MSRAFiller<TypeParam>(this->filler_param_));
+ this->filler_->Fill(this->blob_);
+}
+
+TYPED_TEST(MSRAFillerTest, TestFill5D) {
+ EXPECT_TRUE(this->blob_);
+ vector<int> blob_shape;
+ blob_shape.push_back(2);
+ blob_shape.push_back(3);
+ blob_shape.push_back(4);
+ blob_shape.push_back(5);
+ blob_shape.push_back(2);
+ this->blob_->Reshape(blob_shape);
+ this->filler_param_.set_variance_norm(FillerParameter_VarianceNorm_AVERAGE);
+ this->filler_.reset(new MSRAFiller<TypeParam>(this->filler_param_));
+ this->filler_->Fill(this->blob_);
}
template <typename Dtype>