aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/NetworkQuantizationScheme.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/armnn/NetworkQuantizationScheme.hpp')
-rw-r--r--src/armnn/NetworkQuantizationScheme.hpp42
1 files changed, 37 insertions, 5 deletions
diff --git a/src/armnn/NetworkQuantizationScheme.hpp b/src/armnn/NetworkQuantizationScheme.hpp
index a5b7542748..a78fd725b4 100644
--- a/src/armnn/NetworkQuantizationScheme.hpp
+++ b/src/armnn/NetworkQuantizationScheme.hpp
@@ -26,7 +26,7 @@ struct IQuantizationScheme
virtual ~IQuantizationScheme() {}
};
-struct QAsymm8QuantizationScheme : IQuantizationScheme
+struct QAsymmU8QuantizationScheme : IQuantizationScheme
{
OffsetScalePair ComputeScheme(double min, double max) const override
{
@@ -61,6 +61,42 @@ struct QAsymm8QuantizationScheme : IQuantizationScheme
DataType GetDataType() const override { return DataType::QAsymmU8; }
};
+struct QAsymmS8QuantizationScheme : IQuantizationScheme
+{
+ OffsetScalePair ComputeScheme(double min, double max) const override
+ {
+ if (min > max)
+ {
+ throw InvalidArgumentException("min > max will result in invalid quantization.");
+ }
+
+ double highest = (1 << NumBits()) - 1;
+
+ min = std::min(0.0, min); // min <= 0.0
+ max = std::max(0.0, max); // max >= 0.0
+
+ // To avoid dividing by zero when quantizing a zero filled tensor
+ if (min == 0.0 && max == 0.0)
+ {
+ max = 1.0;
+ }
+
+ // Assumes quantization range [0-255]
+ double scale = (max-min) / highest ;
+ double offset = - min / scale;
+
+ //Clamp 0 to Highest
+ offset = std::max(0.0, std::min(highest, offset));
+
+ //-128 on offset to cast to signed range
+ return std::make_pair(static_cast<float>(scale), static_cast<int>(std::round(offset)-128));
+ }
+
+ int NumBits() const override { return 8; }
+
+ DataType GetDataType() const override { return DataType::QAsymmS8; }
+};
+
struct QSymmS8QuantizationScheme : IQuantizationScheme
{
OffsetScalePair ComputeScheme(double min, double max) const override
@@ -109,10 +145,6 @@ struct QSymm16QuantizationScheme : IQuantizationScheme
double extent = std::max(std::abs(min), std::abs(max));
double scale = extent / highest;
- if(scale == 0.000457777642)
- {
- return std::make_pair(static_cast<float>(scale), 0);
- }
return std::make_pair(static_cast<float>(scale), 0);
}