| 32 | virtual ~PowerLayerTest() { delete blob_bottom_; delete blob_top_; } |
| 33 | |
| 34 | void TestForward(Dtype power, Dtype scale, Dtype shift) { |
| 35 | LayerParameter layer_param; |
| 36 | layer_param.mutable_power_param()->set_power(power); |
| 37 | layer_param.mutable_power_param()->set_scale(scale); |
| 38 | layer_param.mutable_power_param()->set_shift(shift); |
| 39 | PowerLayer<Dtype> layer(layer_param); |
| 40 | layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); |
| 41 | layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); |
| 42 | // Now, check values |
| 43 | const Dtype* bottom_data = this->blob_bottom_->cpu_data(); |
| 44 | const Dtype* top_data = this->blob_top_->cpu_data(); |
| 45 | const Dtype min_precision = 1e-5; |
| 46 | for (int i = 0; i < this->blob_bottom_->count(); ++i) { |
| 47 | Dtype expected_value = pow(shift + scale * bottom_data[i], power); |
| 48 | if (power == Dtype(0) || power == Dtype(1) || power == Dtype(2)) { |
| 49 | EXPECT_FALSE(isnan(top_data[i])); |
| 50 | } |
| 51 | if (isnan(expected_value)) { |
| 52 | EXPECT_TRUE(isnan(top_data[i])); |
| 53 | } else { |
| 54 | Dtype precision = std::max( |
| 55 | Dtype(std::abs(expected_value * Dtype(1e-4))), min_precision); |
| 56 | EXPECT_NEAR(expected_value, top_data[i], precision); |
| 57 | } |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | void TestBackward(Dtype power, Dtype scale, Dtype shift) { |
| 62 | LayerParameter layer_param; |