From 279814bfdc3e2ec3ed6c4e248356b4e0b2b2abc0 Mon Sep 17 00:00:00 2001 From: Manuel Bottini Date: Fri, 25 Oct 2019 10:28:28 +0100 Subject: COMPMID-2481: Add InputQuantizationInfo!=OutputQuantization Info tests for DeconvolutionLayer Fix on CLGEMMDeconvolutionLayer to use actual output quantization Change-Id: Id9ab2d9a9c839425b5ac54a0501f7bea5a809237 Signed-off-by: Manuel Bottini Reviewed-on: https://review.mlplatform.org/c/2164 Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins Reviewed-by: Georgios Pinitas Reviewed-by: Michele Di Giorgio --- .../CL/functions/CLGEMMDeconvolutionLayer.cpp | 2 +- tests/validation/CL/DeconvolutionLayer.cpp | 31 ++++++++------- tests/validation/NEON/DeconvolutionLayer.cpp | 23 ++++++----- .../fixtures/DeconvolutionLayerFixture.h | 45 ++++++++++++---------- tests/validation/reference/DeconvolutionLayer.cpp | 10 ++--- tests/validation/reference/DeconvolutionLayer.h | 3 +- 6 files changed, 65 insertions(+), 49 deletions(-) diff --git a/src/runtime/CL/functions/CLGEMMDeconvolutionLayer.cpp b/src/runtime/CL/functions/CLGEMMDeconvolutionLayer.cpp index 78e1ae7f05..4671be5b61 100644 --- a/src/runtime/CL/functions/CLGEMMDeconvolutionLayer.cpp +++ b/src/runtime/CL/functions/CLGEMMDeconvolutionLayer.cpp @@ -279,7 +279,7 @@ void CLGEMMDeconvolutionLayer::configure(const ICLTensor *input, const ICLTensor { const UniformQuantizationInfo iq_info = input->info()->quantization_info().uniform(); const UniformQuantizationInfo wq_info = weights->info()->quantization_info().uniform(); - const UniformQuantizationInfo oq_info = _gemmlowp_final.info()->quantization_info().uniform(); + const UniformQuantizationInfo oq_info = output->info()->quantization_info().uniform(); float multiplier = iq_info.scale * wq_info.scale / oq_info.scale; int output_multiplier(0); diff --git a/tests/validation/CL/DeconvolutionLayer.cpp b/tests/validation/CL/DeconvolutionLayer.cpp index 9dafd1ef89..ac8e170b80 100644 --- a/tests/validation/CL/DeconvolutionLayer.cpp +++ b/tests/validation/CL/DeconvolutionLayer.cpp @@ -269,10 +269,11 @@ TEST_SUITE(Quantized) TEST_SUITE(QASYMM8) TEST_SUITE(W4x4) -FIXTURE_DATA_TEST_CASE(Run, CLDeconvolutionLayerQuantizedFixture4x4, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data4x4, framework::dataset::make("DataType", +FIXTURE_DATA_TEST_CASE(Run, CLDeconvolutionLayerQuantizedFixture4x4, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(combine(data4x4, framework::dataset::make("DataType", DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 0))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output @@ -281,20 +282,23 @@ FIXTURE_DATA_TEST_CASE(Run, CLDeconvolutionLayerQuantizedFixture4x4, fr TEST_SUITE_END() // W4x4 TEST_SUITE(W3x3) -FIXTURE_DATA_TEST_CASE(RunSmall, CLDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data3x3_precommit, +FIXTURE_DATA_TEST_CASE(RunSmall, CLDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(data3x3_precommit, framework::dataset::make("DataType", DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 0))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output validate(CLAccessor(_target), _reference, tolerance_qasymm8, tolerance_num); } -FIXTURE_DATA_TEST_CASE(RunLarge, CLDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data3x3, framework::dataset::make("DataType", - DataType::QASYMM8)), +FIXTURE_DATA_TEST_CASE(RunLarge, CLDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(combine(data3x3, + framework::dataset::make("DataType", + DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 0))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output @@ -303,11 +307,11 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data2x2_precommit, - framework::dataset::make("DataType", - DataType::QASYMM8)), +FIXTURE_DATA_TEST_CASE(RunSmall, CLDeconvolutionLayerQuantizedFixture2x2, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(data2x2_precommit, + framework::dataset::make("DataType", DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 0))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output @@ -316,10 +320,11 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLDeconvolutionLayerQuantizedFixture2x2, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data1x1, framework::dataset::make("DataType", +FIXTURE_DATA_TEST_CASE(Run, CLDeconvolutionLayerQuantizedFixture1x1, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(combine(data1x1, framework::dataset::make("DataType", DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 0))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output diff --git a/tests/validation/NEON/DeconvolutionLayer.cpp b/tests/validation/NEON/DeconvolutionLayer.cpp index 500ef10661..b6911c6dbc 100644 --- a/tests/validation/NEON/DeconvolutionLayer.cpp +++ b/tests/validation/NEON/DeconvolutionLayer.cpp @@ -274,10 +274,11 @@ TEST_SUITE(Quantized) TEST_SUITE(QASYMM8) TEST_SUITE(W4x4) -FIXTURE_DATA_TEST_CASE(Run, NEDeconvolutionLayerQuantizedFixture4x4, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data4x4, framework::dataset::make("DataType", +FIXTURE_DATA_TEST_CASE(Run, NEDeconvolutionLayerQuantizedFixture4x4, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(combine(data4x4, framework::dataset::make("DataType", DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 10))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output @@ -286,20 +287,23 @@ FIXTURE_DATA_TEST_CASE(Run, NEDeconvolutionLayerQuantizedFixture4x4, fr TEST_SUITE_END() // W4x4 TEST_SUITE(W3x3) -FIXTURE_DATA_TEST_CASE(RunSmall, NEDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data3x3_precommit, +FIXTURE_DATA_TEST_CASE(RunSmall, NEDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(data3x3_precommit, framework::dataset::make("DataType", DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 10))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output validate(Accessor(_target), _reference, tolerance_qasymm8, tolerance_num); } -FIXTURE_DATA_TEST_CASE(RunLarge, NEDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data3x3, framework::dataset::make("DataType", - DataType::QASYMM8)), +FIXTURE_DATA_TEST_CASE(RunLarge, NEDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(combine(data3x3, + framework::dataset::make("DataType", + DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 10))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output @@ -308,10 +312,11 @@ FIXTURE_DATA_TEST_CASE(RunLarge, NEDeconvolutionLayerQuantizedFixture3x3, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data1x1, framework::dataset::make("DataType", +FIXTURE_DATA_TEST_CASE(Run, NEDeconvolutionLayerQuantizedFixture1x1, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(combine(data1x1, framework::dataset::make("DataType", DataType::QASYMM8)), data_layouts_dataset), - framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255.f, 10))), + framework::dataset::make("InputQuantizationInfo", { QuantizationInfo(1.f / 255.f, 0), QuantizationInfo(2.f / 255.f, 0) })), + framework::dataset::make("OutputQuantizationInfo", { QuantizationInfo(3.f / 255.f, 0), QuantizationInfo(4.f / 255.f, 0) })), add_bias_dataset)) { // Validate output diff --git a/tests/validation/fixtures/DeconvolutionLayerFixture.h b/tests/validation/fixtures/DeconvolutionLayerFixture.h index a25a65f997..b819e651ff 100644 --- a/tests/validation/fixtures/DeconvolutionLayerFixture.h +++ b/tests/validation/fixtures/DeconvolutionLayerFixture.h @@ -51,12 +51,13 @@ public: public: template void setup(TensorShape input_shape, TensorShape weights_shape, TensorShape bias_shape, TensorShape output_shape, PadStrideInfo info, - DataType data_type, DataLayout data_layout, QuantizationInfo quantization_info, bool add_bias) + DataType data_type, DataLayout data_layout, QuantizationInfo input_quantization_info, QuantizationInfo output_quantization_info, bool add_bias) { - _data_type = data_type; - _bias_data_type = is_data_type_quantized_asymmetric(data_type) ? DataType::S32 : data_type; - _data_layout = data_layout; - _quantization_info = quantization_info; + _data_type = data_type; + _bias_data_type = is_data_type_quantized_asymmetric(data_type) ? DataType::S32 : data_type; + _data_layout = data_layout; + _input_quantization_info = input_quantization_info; + _output_quantization_info = output_quantization_info; _target = compute_target(input_shape, weights_shape, bias_shape, output_shape, info, add_bias); _reference = compute_reference(input_shape, weights_shape, bias_shape, output_shape, info, add_bias); @@ -126,10 +127,10 @@ protected: } // Create tensors - TensorType src = create_tensor(input_shape, _data_type, 1, _quantization_info, _data_layout); - TensorType weights = create_tensor(weights_shape, _data_type, 1, _quantization_info, _data_layout); - TensorType bias = create_tensor(bias_shape, _bias_data_type, 1, _quantization_info, _data_layout); - TensorType dst = create_tensor(output_shape, _data_type, 1, _quantization_info, _data_layout); + TensorType src = create_tensor(input_shape, _data_type, 1, _input_quantization_info, _data_layout); + TensorType weights = create_tensor(weights_shape, _data_type, 1, _input_quantization_info, _data_layout); + TensorType bias = create_tensor(bias_shape, _bias_data_type, 1, _input_quantization_info, _data_layout); + TensorType dst = create_tensor(output_shape, _data_type, 1, _output_quantization_info, _data_layout); // Create and configure function FunctionType conv; @@ -178,9 +179,9 @@ protected: const PadStrideInfo &info, bool add_bias) { // Create reference - SimpleTensor src{ input_shape, _data_type, 1, _quantization_info }; - SimpleTensor weights{ weights_shape, _data_type, 1, _quantization_info }; - SimpleTensor bias{ bias_shape, _bias_data_type, 1, _quantization_info }; + SimpleTensor src{ input_shape, _data_type, 1, _input_quantization_info }; + SimpleTensor weights{ weights_shape, _data_type, 1, _input_quantization_info }; + SimpleTensor bias{ bias_shape, _bias_data_type, 1, _input_quantization_info }; // Fill reference fill(src, 0); @@ -195,7 +196,7 @@ protected: fill_zeros(bias); } - return reference::deconvolution_layer(src, weights, bias, output_shape, info); + return reference::deconvolution_layer(src, weights, bias, output_shape, info, _output_quantization_info); } TensorType _target{}; @@ -203,7 +204,8 @@ protected: DataType _data_type{}; DataType _bias_data_type{}; DataLayout _data_layout{}; - QuantizationInfo _quantization_info{}; + QuantizationInfo _input_quantization_info{}; + QuantizationInfo _output_quantization_info{}; }; template @@ -222,7 +224,8 @@ public: TensorInfo input_info(input_shape, 1, data_type); TensorInfo weights_info(weights_shape, 1, data_type); TensorShape output_shape = compute_deconvolution_output_shape(out_dim, input_info, weights_info); - DeconvolutionLayerFixtureBase::setup(input_shape, weights_shape, bias_shape, output_shape, info, data_type, data_layout, QuantizationInfo(), add_bias); + DeconvolutionLayerFixtureBase::setup(input_shape, weights_shape, bias_shape, output_shape, info, data_type, data_layout, QuantizationInfo(), + QuantizationInfo(), add_bias); } }; @@ -242,7 +245,8 @@ public: TensorInfo input_info(input_shape, 1, data_type); TensorInfo weights_info(weights_shape, 1, data_type); TensorShape output_shape = compute_deconvolution_output_shape(out_dim, input_info, weights_info); - DeconvolutionLayerFixtureBase::setup(input_shape, weights_shape, bias_shape, output_shape, info, data_type, data_layout, QuantizationInfo(), add_bias); + DeconvolutionLayerFixtureBase::setup(input_shape, weights_shape, bias_shape, output_shape, info, data_type, data_layout, QuantizationInfo(), + QuantizationInfo(), add_bias); } }; @@ -252,17 +256,18 @@ class DeconvolutionValidationQuantizedFixture : public DeconvolutionLayerFixture public: template void setup(TensorShape input_shape, unsigned int sx, unsigned int sy, unsigned int padx, unsigned int pady, - unsigned int num_kernels, DataType data_type, DataLayout data_layout, QuantizationInfo quantization_info, bool add_bias) + unsigned int num_kernels, DataType data_type, DataLayout data_layout, QuantizationInfo input_quantization_info, QuantizationInfo output_quantization_info, bool add_bias) { ARM_COMPUTE_ERROR_ON_MSG(kernel_size_x != kernel_size_y, "Only square kernels supported"); const TensorShape weights_shape(kernel_size_x, kernel_size_y, input_shape.z(), num_kernels); const TensorShape bias_shape(num_kernels); const PadStrideInfo info(sx, sy, padx, pady, DimensionRoundingType::CEIL); auto out_dim = deconvolution_output_dimensions(input_shape.x(), input_shape.y(), kernel_size_x, kernel_size_y, info); - TensorInfo input_info(input_shape, 1, data_type, quantization_info); - TensorInfo weights_info(weights_shape, 1, data_type, quantization_info); + TensorInfo input_info(input_shape, 1, data_type, input_quantization_info); + TensorInfo weights_info(weights_shape, 1, data_type, input_quantization_info); TensorShape output_shape = compute_deconvolution_output_shape(out_dim, input_info, weights_info); - DeconvolutionLayerFixtureBase::setup(input_shape, weights_shape, bias_shape, output_shape, info, data_type, data_layout, quantization_info, add_bias); + DeconvolutionLayerFixtureBase::setup(input_shape, weights_shape, bias_shape, output_shape, info, data_type, data_layout, input_quantization_info, + output_quantization_info, add_bias); } }; diff --git a/tests/validation/reference/DeconvolutionLayer.cpp b/tests/validation/reference/DeconvolutionLayer.cpp index 343ea5e725..0e0ea57e7d 100644 --- a/tests/validation/reference/DeconvolutionLayer.cpp +++ b/tests/validation/reference/DeconvolutionLayer.cpp @@ -35,7 +35,7 @@ namespace reference { template SimpleTensor deconvolution_layer(const SimpleTensor &src, const SimpleTensor &weights, const SimpleTensor &bias, const TensorShape &output_shape, - const PadStrideInfo &info) + const PadStrideInfo &info, QuantizationInfo out_qinfo) { // Create reference const unsigned int pad_left = info.pad_left(); @@ -133,15 +133,15 @@ SimpleTensor deconvolution_layer(const SimpleTensor &src, const SimpleTens } const PadStrideInfo conv_info(1, 1, 0, 0, 0, 0, DimensionRoundingType::CEIL); - return convolution_layer(scaled, weights_flipped, bias, output_shape, conv_info); + return convolution_layer(scaled, weights_flipped, bias, output_shape, conv_info, Size2D(1U, 1U), 1, out_qinfo); } template SimpleTensor deconvolution_layer(const SimpleTensor &src, const SimpleTensor &weights, const SimpleTensor &bias, const TensorShape &output_shape, - const PadStrideInfo &info); + const PadStrideInfo &info, QuantizationInfo out_quant_info); template SimpleTensor deconvolution_layer(const SimpleTensor &src, const SimpleTensor &weights, const SimpleTensor &bias, const TensorShape &output_shape, - const PadStrideInfo &info); + const PadStrideInfo &info, QuantizationInfo out_quant_info); template SimpleTensor deconvolution_layer(const SimpleTensor &src, const SimpleTensor &weights, const SimpleTensor &bias, const TensorShape &output_shape, - const PadStrideInfo &info); + const PadStrideInfo &info, QuantizationInfo out_quant_info); } // namespace reference } // namespace validation } // namespace test diff --git a/tests/validation/reference/DeconvolutionLayer.h b/tests/validation/reference/DeconvolutionLayer.h index 21583e3b12..e7c2f9d6bf 100644 --- a/tests/validation/reference/DeconvolutionLayer.h +++ b/tests/validation/reference/DeconvolutionLayer.h @@ -46,7 +46,8 @@ namespace reference * */ template -SimpleTensor deconvolution_layer(const SimpleTensor &src, const SimpleTensor &weights, const SimpleTensor &bias, const TensorShape &output_shape, const PadStrideInfo &info); +SimpleTensor deconvolution_layer(const SimpleTensor &src, const SimpleTensor &weights, const SimpleTensor &bias, const TensorShape &output_shape, const PadStrideInfo &info, + QuantizationInfo out_qinfo = QuantizationInfo()); } // namespace reference } // namespace validation } // namespace test -- cgit v1.2.1