aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorUsama Arif <usama.arif@arm.com>2019-03-14 15:36:54 +0000
committerPablo Marquez <pablo.tello@arm.com>2019-03-27 09:22:04 +0000
commit8cf8c1123440c2002ee108d1949529bf21eac944 (patch)
treecc61d9ed5ee805c4356b8497b2e81f67b194b36a /tests
parentadc2186c06ca27f368dfe6ceadce449551259efc (diff)
downloadComputeLibrary-8cf8c1123440c2002ee108d1949529bf21eac944.tar.gz
COMPMID-1944 Add support for "reflect" padding mode in NEPad
Change-Id: I56c42524497d37d44708648571fa211ac1afbd98 Signed-off-by: Usama Arif <usama.arif@arm.com> Reviewed-on: https://review.mlplatform.org/c/885 Tested-by: Arm Jenkins <bsgcomp@arm.com> Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Pablo Marquez <pablo.tello@arm.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/validation/CL/PadLayer.cpp20
-rw-r--r--tests/validation/NEON/PadLayer.cpp148
-rw-r--r--tests/validation/fixtures/PadLayerFixture.h48
3 files changed, 128 insertions, 88 deletions
diff --git a/tests/validation/CL/PadLayer.cpp b/tests/validation/CL/PadLayer.cpp
index 4bbd7b8e14..9430b1212b 100644
--- a/tests/validation/CL/PadLayer.cpp
+++ b/tests/validation/CL/PadLayer.cpp
@@ -94,8 +94,9 @@ TEST_SUITE(Float)
TEST_SUITE(FP32)
FIXTURE_DATA_TEST_CASE(RunPadding, CLPaddingFixture<float>, framework::DatasetMode::ALL,
combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::F32 })),
- PaddingSizesDataset))
+ combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::F32 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT })))
{
// Validate output
validate(CLAccessor(_target), _reference);
@@ -105,8 +106,9 @@ TEST_SUITE_END() // FP32
TEST_SUITE(FP16)
FIXTURE_DATA_TEST_CASE(RunPadding, CLPaddingFixture<half>, framework::DatasetMode::ALL,
combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::F16 })),
- PaddingSizesDataset))
+ combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::F16 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT })))
{
// Validate output
validate(CLAccessor(_target), _reference);
@@ -118,8 +120,9 @@ TEST_SUITE(Integer)
TEST_SUITE(S8)
FIXTURE_DATA_TEST_CASE(RunPadding, CLPaddingFixture<int8_t>, framework::DatasetMode::ALL,
combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::S8 })),
- PaddingSizesDataset))
+ combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::S8 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT })))
{
// Validate output
validate(CLAccessor(_target), _reference);
@@ -131,8 +134,9 @@ TEST_SUITE(Quantized)
TEST_SUITE(QASYMM8)
FIXTURE_DATA_TEST_CASE(RunPadding, CLPaddingFixture<uint8_t>, framework::DatasetMode::ALL,
combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::QASYMM8 })),
- PaddingSizesDataset))
+ combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::QASYMM8 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT })))
{
// Validate output
validate(CLAccessor(_target), _reference);
diff --git a/tests/validation/NEON/PadLayer.cpp b/tests/validation/NEON/PadLayer.cpp
index 90d3ae98d8..5049347f27 100644
--- a/tests/validation/NEON/PadLayer.cpp
+++ b/tests/validation/NEON/PadLayer.cpp
@@ -42,12 +42,14 @@ namespace validation
{
namespace
{
-const auto PaddingSizesDataset = framework::dataset::make("PaddingSize", { PaddingList{ { 0, 0 } },
+const auto PaddingSizesDataset = framework::dataset::make("PaddingSize",
+{
+ PaddingList{ { 0, 0 } },
PaddingList{ { 1, 1 } },
PaddingList{ { 1, 1 }, { 2, 2 } },
- PaddingList{ { 1, 1 }, { 1, 1 }, { 1, 1 }, { 1, 1 } },
- PaddingList{ { 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 2 } },
- PaddingList{ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 1, 1 } }
+ PaddingList{ { 1, 1 }, { 1, 1 }, { 1, 1 } },
+ PaddingList{ { 0, 0 }, { 1, 0 }, { 0, 1 } },
+ PaddingList{ { 0, 1 }, { 1, 0 }, { 0, 1 } },
});
} // namespace
@@ -57,33 +59,62 @@ TEST_SUITE(PadLayer)
// *INDENT-OFF*
// clang-format off
-DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
- framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/output
- TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching shapes
- TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32)
- }),
- framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F16),
- TensorInfo(TensorShape(28U, 11U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(29U, 17U, 2U), 1, DataType::F32),
- TensorInfo(TensorShape(29U, 15U, 4U, 3U), 1, DataType::F32),
- TensorInfo(TensorShape(27U, 14U, 3U, 4U), 1, DataType::F32),
- TensorInfo(TensorShape(32U, 13U, 2U, 3U), 1, DataType::F32)
- })),
- framework::dataset::make("PaddingSize", { PaddingList{{0, 0}},
- PaddingList{{1, 1}},
- PaddingList{{1, 1}, {2, 2}},
- PaddingList{{1,1}, {1,1}, {1,1}, {1,1}},
- PaddingList{{0,0}, {1,0}, {0,1}, {1,2}},
- PaddingList{{0,0}, {0,0}, {0,0}, {1,1}}
- })),
- framework::dataset::make("Expected", { false, false, true, true, true, true })),
- input_info, output_info, padding, expected)
+DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
+ framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/output
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching shapes
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/output
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching shapes
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32)
+ }),
+ framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F16),
+ TensorInfo(TensorShape(28U, 11U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(29U, 17U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(29U, 15U, 4U, 3U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 14U, 3U, 4U), 1, DataType::F32),
+ TensorInfo(TensorShape(32U, 13U, 2U, 3U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F16),
+ TensorInfo(TensorShape(28U, 11U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(29U, 17U, 2U), 1, DataType::F32),
+ TensorInfo(TensorShape(29U, 15U, 4U, 3U), 1, DataType::F32),
+ TensorInfo(TensorShape(27U, 14U, 3U, 4U), 1, DataType::F32),
+ TensorInfo(TensorShape(32U, 13U, 2U, 3U), 1, DataType::F32)
+ })),
+ framework::dataset::make("PaddingSize", { PaddingList{{0, 0}},
+ PaddingList{{1, 1}},
+ PaddingList{{1, 1}, {2, 2}},
+ PaddingList{{1,1}, {1,1}, {1,1}, {1,1}},
+ PaddingList{{0,0}, {1,0}, {0,1}, {1,2}},
+ PaddingList{{0,0}, {0,0}, {0,0}, {1,1}},
+ PaddingList{{0, 0}},
+ PaddingList{{1, 1}},
+ PaddingList{{1, 1}, {2, 2}},
+ PaddingList{{1,1}, {1,1}, {1,1}, {1,1}},
+ PaddingList{{0,0}, {1,0}, {0,1}, {1,2}},
+ PaddingList{{0,0}, {0,0}, {0,0}, {1,1}}
+ })),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT,
+ PaddingMode::CONSTANT,
+ PaddingMode::CONSTANT,
+ PaddingMode::CONSTANT,
+ PaddingMode::CONSTANT,
+ PaddingMode::CONSTANT,
+ PaddingMode::REFLECT,
+ PaddingMode::REFLECT,
+ PaddingMode::REFLECT,
+ PaddingMode::REFLECT,
+ PaddingMode::REFLECT,
+ PaddingMode::SYMMETRIC })),
+ framework::dataset::make("Expected", { false, false, true, true, true, true, false, false, true, false, false, true })),
+ input_info, output_info, padding, mode, expected)
{
- Status s = NEPadLayer::validate(&input_info.clone()->set_is_resizable(true), &output_info.clone()->set_is_resizable(true), padding);
- ARM_COMPUTE_EXPECT(bool(s) == expected, framework::LogLevel::ERRORS);
+ ARM_COMPUTE_EXPECT(bool(NEPadLayer::validate(&input_info.clone()->set_is_resizable(true), &output_info.clone()->set_is_resizable(true), padding, PixelValue(), mode)) == expected, framework::LogLevel::ERRORS);
}
// clang-format on
@@ -96,17 +127,17 @@ TEST_SUITE(Float)
TEST_SUITE(FP32)
FIXTURE_DATA_TEST_CASE(RunSmall, NEPaddingFixture<float>, framework::DatasetMode::ALL,
- combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::F32 })),
- PaddingSizesDataset))
+ combine(combine(combine(datasets::Small3DShapes(), framework::dataset::make("DataType", { DataType::F32 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT, PaddingMode::REFLECT })))
{
// Validate output
validate(Accessor(_target), _reference);
}
FIXTURE_DATA_TEST_CASE(RunLarge, NEPaddingFixture<float>, framework::DatasetMode::NIGHTLY,
- combine(
- combine(datasets::LargeShapes(), framework::dataset::make("DataType", { DataType::F32 })),
- PaddingSizesDataset))
+ combine(combine(combine(datasets::Large3DShapes(), framework::dataset::make("DataType", { DataType::F32 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT, PaddingMode::REFLECT, PaddingMode::SYMMETRIC })))
{
// Validate output
validate(Accessor(_target), _reference);
@@ -116,17 +147,17 @@ TEST_SUITE_END() // FP32
#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
TEST_SUITE(FP16)
FIXTURE_DATA_TEST_CASE(RunSmall, NEPaddingFixture<half>, framework::DatasetMode::ALL,
- combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::F16 })),
- PaddingSizesDataset))
+ combine(combine(combine(datasets::Small3DShapes(), framework::dataset::make("DataType", { DataType::F16 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT, PaddingMode::REFLECT })))
{
// Validate output
validate(Accessor(_target), _reference);
}
FIXTURE_DATA_TEST_CASE(RunLarge, NEPaddingFixture<half>, framework::DatasetMode::NIGHTLY,
- combine(
- combine(datasets::LargeShapes(), framework::dataset::make("DataType", { DataType::F16 })),
- PaddingSizesDataset))
+ combine(combine(combine(datasets::Large3DShapes(), framework::dataset::make("DataType", { DataType::F16 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT, PaddingMode::REFLECT, PaddingMode::SYMMETRIC })))
{
// Validate output
validate(Accessor(_target), _reference);
@@ -135,41 +166,20 @@ TEST_SUITE_END() // FP16
#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
TEST_SUITE_END() // Float
-TEST_SUITE(Integer)
-TEST_SUITE(S8)
-FIXTURE_DATA_TEST_CASE(RunSmall, NEPaddingFixture<int8_t>, framework::DatasetMode::ALL,
- combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::S8 })),
- PaddingSizesDataset))
-{
- // Validate output
- validate(Accessor(_target), _reference);
-}
-FIXTURE_DATA_TEST_CASE(RunLarge, NEPaddingFixture<int8_t>, framework::DatasetMode::NIGHTLY,
- combine(
- combine(datasets::LargeShapes(), framework::dataset::make("DataType", { DataType::S8 })),
- PaddingSizesDataset))
-{
- // Validate output
- validate(Accessor(_target), _reference);
-}
-TEST_SUITE_END() // S8
-TEST_SUITE_END() // Integer
-
TEST_SUITE(Quantized)
TEST_SUITE(QASYMM8)
FIXTURE_DATA_TEST_CASE(RunSmall, NEPaddingFixture<uint8_t>, framework::DatasetMode::ALL,
- combine(
- combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::QASYMM8 })),
- PaddingSizesDataset))
+ combine(combine(combine(datasets::Small3DShapes(), framework::dataset::make("DataType", { DataType::QASYMM8 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT, PaddingMode::REFLECT })))
{
// Validate output
validate(Accessor(_target), _reference);
}
FIXTURE_DATA_TEST_CASE(RunLarge, NEPaddingFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
- combine(
- combine(datasets::LargeShapes(), framework::dataset::make("DataType", { DataType::QASYMM8 })),
- PaddingSizesDataset))
+ combine(combine(combine(datasets::Large3DShapes(), framework::dataset::make("DataType", { DataType::QASYMM8 })),
+ PaddingSizesDataset),
+ framework::dataset::make("PaddingMode", { PaddingMode::CONSTANT, PaddingMode::REFLECT, PaddingMode::SYMMETRIC })))
{
// Validate output
validate(Accessor(_target), _reference);
diff --git a/tests/validation/fixtures/PadLayerFixture.h b/tests/validation/fixtures/PadLayerFixture.h
index 839313a118..3538cabfeb 100644
--- a/tests/validation/fixtures/PadLayerFixture.h
+++ b/tests/validation/fixtures/PadLayerFixture.h
@@ -45,30 +45,54 @@ class PaddingFixture : public framework::Fixture
{
public:
template <typename...>
- void setup(TensorShape shape, DataType data_type, const PaddingList &padding)
+ void setup(TensorShape shape, DataType data_type, const PaddingList &padding, const PaddingMode mode)
{
- _target = compute_target(shape, data_type, padding);
- _reference = compute_reference(shape, data_type, padding);
+ PaddingList clamped_padding = padding;
+ if(mode != PaddingMode::CONSTANT)
+ {
+ // Clamp padding to prevent applying more than is possible.
+ for(uint32_t i = 0; i < padding.size(); ++i)
+ {
+ if(mode == PaddingMode::REFLECT)
+ {
+ clamped_padding[i].first = std::min(static_cast<uint64_t>(padding[i].first), static_cast<uint64_t>(shape[i] - 1));
+ clamped_padding[i].second = std::min(static_cast<uint64_t>(padding[i].second), static_cast<uint64_t>(shape[i] - 1));
+ }
+ else
+ {
+ clamped_padding[i].first = std::min(static_cast<uint64_t>(padding[i].first), static_cast<uint64_t>(shape[i]));
+ clamped_padding[i].second = std::min(static_cast<uint64_t>(padding[i].second), static_cast<uint64_t>(shape[i]));
+ }
+ }
+ }
+ _target = compute_target(shape, data_type, clamped_padding, mode);
+ _reference = compute_reference(shape, data_type, clamped_padding, mode);
}
protected:
template <typename U>
- void fill(U &&tensor)
+ void fill(U &&tensor, int i)
{
- library->fill_tensor_uniform(tensor, 0);
+ library->fill_tensor_uniform(tensor, i);
}
TensorType compute_target(const TensorShape &shape,
DataType data_type,
- const PaddingList &paddings)
+ const PaddingList &paddings,
+ const PaddingMode mode)
{
// Create tensors
TensorType src = create_tensor<TensorType>(shape, data_type);
TensorType dst;
+ TensorType const_val = create_tensor<TensorType>(TensorShape(1), data_type);
+ const_val.allocator()->allocate();
+ fill(AccessorType(const_val), 1);
+ T const_value = *static_cast<T *>(AccessorType(const_val)(Coordinates(0)));
+
// Create and configure function
FunctionType padding;
- padding.configure(&src, &dst, paddings);
+ padding.configure(&src, &dst, paddings, const_value, mode);
ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS);
ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS);
@@ -81,7 +105,7 @@ protected:
ARM_COMPUTE_EXPECT(!dst.info()->is_resizable(), framework::LogLevel::ERRORS);
// Fill tensors
- fill(AccessorType(src));
+ fill(AccessorType(src), 0);
// Compute function
padding.run();
@@ -90,15 +114,17 @@ protected:
}
SimpleTensor<T> compute_reference(const TensorShape &shape, DataType data_type,
- const PaddingList &paddings)
+ const PaddingList &paddings, const PaddingMode mode)
{
// Create reference tensor
SimpleTensor<T> src{ shape, data_type };
+ SimpleTensor<T> const_val{ TensorShape(1), data_type };
// Fill reference tensor
- fill(src);
+ fill(src, 0);
+ fill(const_val, 1);
- return reference::pad_layer(src, paddings);
+ return reference::pad_layer(src, paddings, const_val[0], mode);
}
TensorType _target{};