diff --git a/inference-engine/src/low_precision_transformations/src/layer_transformation.cpp b/inference-engine/src/low_precision_transformations/src/layer_transformation.cpp index dbbb8206b4d..834aa6931c5 100644 --- a/inference-engine/src/low_precision_transformations/src/layer_transformation.cpp +++ b/inference-engine/src/low_precision_transformations/src/layer_transformation.cpp @@ -221,18 +221,20 @@ LayerTransformation::PrecisionDetails LayerTransformation::getPrecisionDetails(c bool hasZeroPoint = false; for (size_t i = 0; i < quantizationDetails.outputLowValues.size(); ++i) { const bool signedInterval = std::signbit(quantizationDetails.outputLowValues[i]) != std::signbit(quantizationDetails.outputHighValues[i]); - const bool boundaryValuesAreNotZero = - (std::fabs(quantizationDetails.outputLowValues[i]) >= zeroThreshold) && - (std::fabs(quantizationDetails.outputHighValues[i]) >= zeroThreshold); - if (signedInterval && boundaryValuesAreNotZero) { + const bool outputLowValueIsNotZero = std::fabs(quantizationDetails.outputLowValues[i]) >= zeroThreshold; + if (signedInterval && outputLowValueIsNotZero) { // signed unsignedPrecision = false; hasNegative = true; - const float expectedRatio = quantizationDetails.levels == 256 ? asymmetricIntervalSideRatio256 : -1.f; - const float actualRatio = quantizationDetails.outputLowValues[i] / quantizationDetails.outputHighValues[i]; - const float actual = std::fabs((actualRatio - expectedRatio) / std::min(actualRatio, expectedRatio)); - if (actual > quantizationIntervalAsymmetryThreshold) { + if (quantizationDetails.outputHighValues[i] != 0.f) { + const float expectedRatio = quantizationDetails.levels == 256 ? asymmetricIntervalSideRatio256 : -1.f; + const float actualRatio = quantizationDetails.outputLowValues[i] / quantizationDetails.outputHighValues[i]; + const float actual = std::fabs((actualRatio - expectedRatio) / std::min(actualRatio, expectedRatio)); + if (actual > quantizationIntervalAsymmetryThreshold) { + hasZeroPoint = true; + } + } else { hasZeroPoint = true; } #ifdef LPT_PRINT_DEQUANTIZATION_INFO @@ -244,8 +246,8 @@ LayerTransformation::PrecisionDetails LayerTransformation::getPrecisionDetails(c } else { // unsigned signedPrecision = false; - if (boundaryValuesAreNotZero) { - hasZeroPoint = boundaryValuesAreNotZero; + if (outputLowValueIsNotZero) { + hasZeroPoint = outputLowValueIsNotZero; } #ifdef LPT_PRINT_DEQUANTIZATION_INFO diff --git a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp index 2f856a61cd7..0208a6b0e72 100644 --- a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp +++ b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp @@ -42,6 +42,10 @@ const std::vector fakeQuantizeOnDataValues = { { 256ul, {}, { 0.f }, { 2.55f }, { 2.55f }, { 2.55f } }, "Pooling", "U8" }, + { + { 256ul, {}, { -127.5f }, { 0.f }, { -127.5f }, { 0.f } }, + "Pooling", "U8" + }, { { 16ul, {}, { 0.f }, { 1.5f }, { 0.f }, { 1.5f } }, "Pooling", "FP32" @@ -50,7 +54,7 @@ const std::vector fakeQuantizeOnDataValues = { { 16ul, {}, { -8.f }, { 7.f }, { -0.8f }, { 0.7f } }, "Pooling", "FP32" }, - // nGraph: I8->FP32 Convert is not supported + // nGraph: I8->FP32 Convert is not supported // { 256ul, {}, { -1.28f} , { 1.27f }, { -1.28f} , { 1.27f } }, // { 256ul, { 1ul }, { -1.28f} , { 1.27f } } }; diff --git a/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp b/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp index 35f047794da..62fb144c785 100644 --- a/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp +++ b/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/low_precision_transformations/fake_quantize_transformation.cpp @@ -26,30 +26,34 @@ const std::vector trasformationParamValues = { }; const std::vector fakeQuantizeOnDataValues = { - { - {256ul, {}, {0.f}, {2.55f}, {0.f}, {2.55f}}, - "Pooling", "U8" - }, - { - { 256ul, { 1ul }, { 0.f }, { 2.55f }, { 0.f }, { 2.55f } }, - "Pooling", "U8" - }, - { - { 256ul, {}, { 0.f }, { 2.55f }, { -1.28f }, { 1.27f } }, - "Pooling", "I8" - }, - { - { 256ul, {}, { 0.f }, { 2.55f }, { 2.55f }, { 2.55f } }, - "Pooling", "U8" - }, - { - { 16ul, {}, { 0.f }, { 1.5f }, { 0.f }, { 1.5f } }, - "Pooling", "FP32" - }, - { - { 16ul, {}, { -8.f }, { 7.f }, { -0.8f }, { 0.7f } }, - "Pooling", "FP32" - }, + { + {256ul, {}, {0.f}, {2.55f}, {0.f}, {2.55f}}, + "Pooling", "U8" + }, + { + { 256ul, { 1ul }, { 0.f }, { 2.55f }, { 0.f }, { 2.55f } }, + "Pooling", "U8" + }, + { + { 256ul, {}, { 0.f }, { 2.55f }, { -1.28f }, { 1.27f } }, + "Pooling", "I8" + }, + { + { 256ul, {}, { 0.f }, { 2.55f }, { 2.55f }, { 2.55f } }, + "Pooling", "U8" + }, + { + { 256ul, {}, { -127.5f }, { 0.f }, { -127.5f }, { 0.f } }, + "Pooling", "U8" + }, + { + { 16ul, {}, { 0.f }, { 1.5f }, { 0.f }, { 1.5f } }, + "Pooling", "FP32" + }, + { + { 16ul, {}, { -8.f }, { 7.f }, { -0.8f }, { 0.7f } }, + "Pooling", "FP32" + }, // nGraph: I8->FP32 Convert is not supported // { 256ul, {}, { -1.28f} , { 1.27f }, { -1.28f} , { 1.27f } }, // { 256ul, { 1ul }, { -1.28f} , { 1.27f } }