From 54e98d98fbe082b265b2c4a384eabe0144866bcc Mon Sep 17 00:00:00 2001 From: Pablo Tello Date: Tue, 5 Feb 2019 16:16:19 +0000 Subject: COMPMID-1918: Different qinfos support in NEConcatLayer. Added support in NEDepthConcatenateLayerKernel and NEWidthConcatenateLayer for different quantization arguments both for the input and output. If input's quantization infos are not homogeneous the input values are requantized using the output's quantization info. Change-Id: I2daa638361947eb3ec848d5425d0a5bbfea1936d Reviewed-on: https://review.mlplatform.org/627 Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio Reviewed-by: Isabella Gottardi --- .../validation/reference/DepthConcatenateLayer.cpp | 30 ++++++++++++++-------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'tests/validation/reference/DepthConcatenateLayer.cpp') diff --git a/tests/validation/reference/DepthConcatenateLayer.cpp b/tests/validation/reference/DepthConcatenateLayer.cpp index 90fbd915b1..6551f0c79e 100644 --- a/tests/validation/reference/DepthConcatenateLayer.cpp +++ b/tests/validation/reference/DepthConcatenateLayer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -34,7 +34,7 @@ namespace validation namespace reference { template -SimpleTensor depthconcatenate_layer(const std::vector> &srcs) +SimpleTensor depthconcatenate_layer(const std::vector> &srcs, SimpleTensor &dst) { // Create reference std::vector shapes; @@ -44,10 +44,6 @@ SimpleTensor depthconcatenate_layer(const std::vector> &srcs) shapes.emplace_back(src.shape()); } - DataType dst_type = srcs.empty() ? DataType::UNKNOWN : srcs[0].data_type(); - TensorShape dst_shape = calculate_depth_concatenate_shape(shapes); - SimpleTensor dst(dst_shape, dst_type); - // Compute reference int depth_offset = 0; const int width_out = dst.shape().x(); @@ -80,8 +76,20 @@ SimpleTensor depthconcatenate_layer(const std::vector> &srcs) { for(int r = 0; r < height; ++r) { - std::copy(src_ptr, src_ptr + width, dst.data() + offset_to_first_element + d * out_stride_z + r * width_out); - src_ptr += width; + if(src.data_type() == DataType::QASYMM8 && src.quantization_info() != dst.quantization_info()) + { + std::transform(src_ptr, src_ptr + width, dst.data() + offset_to_first_element + d * out_stride_z + r * width_out, [src, dst](T t) + { + const float dequantized_input = src.quantization_info().dequantize(t); + return dst.quantization_info().quantize(dequantized_input, RoundingPolicy::TO_NEAREST_UP); + }); + src_ptr += width; + } + else + { + std::copy(src_ptr, src_ptr + width, dst.data() + offset_to_first_element + d * out_stride_z + r * width_out); + src_ptr += width; + } } } } @@ -92,9 +100,9 @@ SimpleTensor depthconcatenate_layer(const std::vector> &srcs) return dst; } -template SimpleTensor depthconcatenate_layer(const std::vector> &srcs); -template SimpleTensor depthconcatenate_layer(const std::vector> &srcs); -template SimpleTensor depthconcatenate_layer(const std::vector> &srcs); +template SimpleTensor depthconcatenate_layer(const std::vector> &srcs, SimpleTensor &dst); +template SimpleTensor depthconcatenate_layer(const std::vector> &srcs, SimpleTensor &dst); +template SimpleTensor depthconcatenate_layer(const std::vector> &srcs, SimpleTensor &dst); } // namespace reference } // namespace validation } // namespace test -- cgit v1.2.1