From aa00ae8b43c6ad06ed3a3ae311542bbe45f85283 Mon Sep 17 00:00:00 2001 From: Vladimir Zinoviev Date: Wed, 3 Nov 2021 18:00:06 +0300 Subject: [PATCH] [LPT] AddTransformation: inconsistent element types when subtract on fullPath is empty (#8277) --- .../low_precision_transformations/src/add.cpp | 4 +++- .../pull_transpose_through_fq.cpp | 3 ++- .../lp_transformations/add_transformation.cpp | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/inference-engine/src/low_precision_transformations/src/add.cpp b/inference-engine/src/low_precision_transformations/src/add.cpp index 0928e355e14..3d6ebd5ca86 100644 --- a/inference-engine/src/low_precision_transformations/src/add.cpp +++ b/inference-engine/src/low_precision_transformations/src/add.cpp @@ -206,7 +206,9 @@ bool AddTransformation::transform(TransformationContext& context, ngraph::patter inputs[emptyPathIndex] = dequantizationEmptyPath.data; inputs[fullPathIndex] = std::make_shared( newSubtractFullPathValues == nullptr ? - fullPathInput : + (fullPathInput.get_element_type() != newMultiplyFullPathValues->get_element_type() ? + std::make_shared(fullPathInput, newMultiplyFullPathValues->get_element_type()) : + fullPathInput) : std::make_shared( // precision on branch with dequantization operations can be different with dequantization precision, // for example: FP16 model with FP32 dequantization diff --git a/inference-engine/src/transformations/src/transformations/common_optimizations/pull_transpose_through_fq.cpp b/inference-engine/src/transformations/src/transformations/common_optimizations/pull_transpose_through_fq.cpp index d07dda95fac..44d5b124341 100644 --- a/inference-engine/src/transformations/src/transformations/common_optimizations/pull_transpose_through_fq.cpp +++ b/inference-engine/src/transformations/src/transformations/common_optimizations/pull_transpose_through_fq.cpp @@ -11,6 +11,7 @@ #include #include #include +#include NGRAPH_RTTI_DEFINITION(ngraph::pass::PullTransposeThroughFQUp, "PullTransposeThroughFQUp", 0); @@ -59,7 +60,7 @@ ngraph::pass::PullTransposeThroughFQUp::PullTransposeThroughFQUp() { opset1::Constant::create(element::i64, Shape{unsqueeze_axes.size()}, unsqueeze_axes)); new_ops.push_back(fq_input.get_node_shared_ptr()); } - fq_input = transpose->clone_with_new_inputs({fq_input, transpose->input_value(1)}); + fq_input = op::util::make_try_fold(fq_input, transpose->input_value(1)); ngraph::copy_runtime_info(transpose, fq_input.get_node_shared_ptr()); fq_inputs.push_back(fq_input); } diff --git a/inference-engine/tests/functional/inference_engine/lp_transformations/add_transformation.cpp b/inference-engine/tests/functional/inference_engine/lp_transformations/add_transformation.cpp index 88b133ad116..ce2e69043e4 100644 --- a/inference-engine/tests/functional/inference_engine/lp_transformations/add_transformation.cpp +++ b/inference-engine/tests/functional/inference_engine/lp_transformations/add_transformation.cpp @@ -931,6 +931,28 @@ const std::vector testValues = { }, "" }, + // float path without subtract + { + false, + -1, + LayerTransformation::createParamsU8I8(), + { + ngraph::element::f32, + { }, + ngraph::element::u8, + { {ngraph::element::f32}, {}, { 4.f }}, + { } + }, + { + ngraph::element::f32, + { {ngraph::element::f32}, {}, { 0.25f } }, + ngraph::element::u8, + { }, + { {}, {}, { 4.f }}, + { } + }, + "" + }, }; INSTANTIATE_TEST_SUITE_P(