diff options
author | Francis Murtagh <francis.murtagh@arm.com> | 2019-06-07 11:28:49 +0100 |
---|---|---|
committer | Francis Murtagh <francis.murtagh@arm.com> | 2019-06-07 12:23:15 +0000 |
commit | edf5230830f8d9794ef0aeb8986da99734ff925f (patch) | |
tree | e2f35f3088e594fdde2361af4b73fb23485f3702 /src/armnn/test | |
parent | 49ab7ada17a354caa5b6263c3a732e55d9cd2743 (diff) | |
download | armnn-edf5230830f8d9794ef0aeb8986da99734ff925f.tar.gz |
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 <francis.murtagh@arm.com>
Diffstat (limited to 'src/armnn/test')
-rw-r--r-- | src/armnn/test/QuantizerTest.cpp | 84 |
1 files changed, 47 insertions, 37 deletions
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<ConstTensor>& 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<ConstTensor>& 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<ConstTensor>& 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<ConstTensor>& 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); } }; |