From edf5230830f8d9794ef0aeb8986da99734ff925f Mon Sep 17 00:00:00 2001 From: Francis Murtagh Date: Fri, 7 Jun 2019 11:28:49 +0100 Subject: IVGCVSW-3228 Fix bias quantization to be INT32 not QAsymm8 * Add function to calculate bias tensor quantization scale from input and weights scales. * Change visitor method of Conv2d, DepthwiseConv and FullyConnected to use the new function. * Fix Unit tests to expect correctly calculated quantization parameters. Change-Id: Ic36f47ceea81243c813d74ccf791e984c819cc71 Signed-off-by: Francis Murtagh --- src/armnn/test/QuantizerTest.cpp | 84 ++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 37 deletions(-) (limited to 'src/armnn/test/QuantizerTest.cpp') diff --git a/src/armnn/test/QuantizerTest.cpp b/src/armnn/test/QuantizerTest.cpp index 337c61585f..213018ab85 100644 --- a/src/armnn/test/QuantizerTest.cpp +++ b/src/armnn/test/QuantizerTest.cpp @@ -86,11 +86,54 @@ protected: } } - void TestConstantQuantizationParams(const TensorInfo& info, const OffsetScalePair& params) + void TestConstantQuantizationParams(const TensorInfo& info, + const OffsetScalePair& params, + DataType dataType = DataType::QuantisedAsymm8) { TestQuantizationParamsImpl(info, DataType::QuantisedAsymm8, params.first, params.second); } + void TestBiasQuantizationParams(const TensorInfo& info, + const OffsetScalePair& qAsymm8Params, + const OffsetScalePair& qSymm16Params, + DataType dataType = DataType::QuantisedAsymm8) + { + switch (m_QuantizerOptions.m_ActivationFormat) + { + case DataType::QuantisedAsymm8: + TestQuantizationParamsImpl(info, dataType, qAsymm8Params.first, qAsymm8Params.second); + break; + case DataType::QuantisedSymm16: + TestQuantizationParamsImpl(info, dataType, qSymm16Params.first, qSymm16Params.second); + break; + default: + throw InvalidArgumentException("Unsupported quantization target"); + } + } + + void TestQuantizationOnLayersWithBiases(const IConnectableLayer* layer, + const ConstTensor& weights, + const Optional& biases) + { + TensorInfo info = layer->GetOutputSlot(0).GetTensorInfo(); + float inputScaleQAsymm8 = 30.0f / g_Asymm8QuantizationBase; + float inputScaleQSymm16 = 15.0f / g_Symm16QuantizationBase; + float weightsScale = 3.0f / g_Asymm8QuantizationBase; + + // Based off default static range [-15.0f, 15.0f] + TestQuantizationParams(info, {inputScaleQAsymm8, 128}, {inputScaleQSymm16, 0}); + + TestConstantQuantizationParams(weights.GetInfo(), {weightsScale, 85}); + + if (biases.has_value()) + { + TestBiasQuantizationParams(biases.value().GetInfo(), + {inputScaleQAsymm8 * weightsScale, 0}, + {inputScaleQSymm16 * weightsScale, 0}, + DataType::Signed32); + } + } + TensorShape m_InputShape; TensorShape m_OutputShape; @@ -726,18 +769,7 @@ void ValidateFullyConnectedLayer(const bool biasEnabled) const Optional& biases, const char* name = nullptr) override { - TensorInfo info = layer->GetOutputSlot(0).GetTensorInfo(); - - // Based off default static range [-15.0f, 15.0f] - TestQuantizationParams( - info, {30.0f / g_Asymm8QuantizationBase, 128}, {15.0f / g_Symm16QuantizationBase, 0}); - - TestConstantQuantizationParams(weights.GetInfo(), {3.0f / g_Asymm8QuantizationBase, 85}); - - if (biases.has_value()) - { - TestConstantQuantizationParams(biases.value().GetInfo(), {30.0f / g_Asymm8QuantizationBase, 0}); - } + TestQuantizationOnLayersWithBiases(layer, weights, biases); } }; @@ -783,18 +815,7 @@ void TestQuantizeConvolution2d(bool useBiases) const Optional& biases, const char *name = nullptr) override { - TensorInfo info = layer->GetOutputSlot(0).GetTensorInfo(); - - // Based off default static range [-15.0f, 15.0f] - TestQuantizationParams( - info, {30.0f / g_Asymm8QuantizationBase, 128}, {15.0f / g_Symm16QuantizationBase, 0}); - - TestConstantQuantizationParams(weights.GetInfo(), {3.0f / g_Asymm8QuantizationBase, 85}); - - if (biases.has_value()) - { - TestConstantQuantizationParams(biases.value().GetInfo(), {3.0f / g_Asymm8QuantizationBase, 85}); - } + TestQuantizationOnLayersWithBiases(layer, weights, biases); } }; @@ -869,18 +890,7 @@ void TestQuantizeDepthwiseConvolution2d(bool useBiases) const Optional& biases, const char *name = nullptr) override { - TensorInfo info = layer->GetOutputSlot(0).GetTensorInfo(); - - // Based off default static range [-15.0f, 15.0f] - TestQuantizationParams( - info, {30.0f / g_Asymm8QuantizationBase, 128}, {15.0f / g_Symm16QuantizationBase, 0}); - - TestConstantQuantizationParams(weights.GetInfo(), {3.0f / g_Asymm8QuantizationBase, 85}); - - if (biases.has_value()) - { - TestConstantQuantizationParams(biases.value().GetInfo(), {3.0f / g_Asymm8QuantizationBase, 85}); - } + TestQuantizationOnLayersWithBiases(layer, weights, biases); } }; -- cgit v1.2.1