aboutsummaryrefslogtreecommitdiff
path: root/arm_compute/core/QuantizationInfo.h
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2019-06-04 13:04:16 +0100
committerGeorgios Pinitas <georgios.pinitas@arm.com>2019-06-24 14:56:23 +0000
commit3d13af8a39f408318328a95d5329bc17fd923438 (patch)
treeb0d9c82062e229f8938d2c9f762ee67758196bf3 /arm_compute/core/QuantizationInfo.h
parentdb09b3783ff9af67c6d373b12aa9a6aff3c5d0f1 (diff)
downloadComputeLibrary-3d13af8a39f408318328a95d5329bc17fd923438.tar.gz
COMPMID-2235: Extend type support for CL/NEON DequantizationLayer.
Adds support for: - QSYMM8 Change-Id: Ia0b839fc844ce0f968dad1b69a001f9a660dbcd5 Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com> Reviewed-on: https://review.mlplatform.org/c/1378 Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Manuel Bottini <manuel.bottini@arm.com> Reviewed-by: Michalis Spyrou <michalis.spyrou@arm.com>
Diffstat (limited to 'arm_compute/core/QuantizationInfo.h')
-rw-r--r--arm_compute/core/QuantizationInfo.h71
1 files changed, 57 insertions, 14 deletions
diff --git a/arm_compute/core/QuantizationInfo.h b/arm_compute/core/QuantizationInfo.h
index 06c9b61154..dcfdd6ba16 100644
--- a/arm_compute/core/QuantizationInfo.h
+++ b/arm_compute/core/QuantizationInfo.h
@@ -63,12 +63,13 @@ struct UniformQuantizationInfo
};
/** Quantization information */
-struct QuantizationInfo
+class QuantizationInfo
{
+public:
/** Default constructor */
QuantizationInfo() noexcept
- : scale(),
- offset()
+ : _scale(),
+ _offset()
{
}
/** Construct quantization info.
@@ -78,7 +79,7 @@ struct QuantizationInfo
* @param[in] scale Scale.
*/
QuantizationInfo(float scale)
- : scale(1, scale), offset()
+ : _scale(1, scale), _offset()
{
}
/** Construct quantization info.
@@ -89,7 +90,7 @@ struct QuantizationInfo
* @param[in] offset Offset.
*/
QuantizationInfo(float scale, int offset)
- : scale(1, scale), offset(1, offset)
+ : _scale(1, scale), _offset(1, offset)
{
}
/** Construct quantization info.
@@ -99,16 +100,32 @@ struct QuantizationInfo
* @param[in] scale Scale.
*/
QuantizationInfo(std::vector<float> scale)
- : scale(scale), offset()
+ : _scale(scale), _offset()
{
}
+ /** Scale vector accessor
+ *
+ * @return A reference to quantization scale metadata
+ */
+ const std::vector<float> &scale() const
+ {
+ return _scale;
+ }
+ /** Offset vector accessor
+ *
+ * @return A reference to quantization offset metadata
+ */
+ const std::vector<int32_t> &offset() const
+ {
+ return _offset;
+ }
/** Indicates whether this QuantizationInfo has valid settings or not
*
* @return True if the this has invalid settings.
*/
bool empty() const
{
- return scale.empty() && offset.empty();
+ return _scale.empty() && _offset.empty();
}
/** Return per layer quantization info
*
@@ -117,14 +134,15 @@ struct QuantizationInfo
UniformQuantizationInfo uniform() const
{
UniformQuantizationInfo uqinfo;
- uqinfo.scale = scale.empty() ? 0 : scale[0];
- uqinfo.offset = offset.empty() ? 0 : offset[0];
+ uqinfo.scale = _scale.empty() ? 0 : _scale[0];
+ uqinfo.offset = _offset.empty() ? 0 : _offset[0];
return uqinfo;
}
- std::vector<float> scale; /**< Vector containing scaling factors */
- std::vector<int32_t> offset; /**< Vector containing zero offsets */
+private:
+ std::vector<float> _scale; /**< Vector containing scaling factors */
+ std::vector<int32_t> _offset; /**< Vector containing zero offsets */
};
/** Check whether two quantization info are equal.
@@ -136,7 +154,7 @@ struct QuantizationInfo
*/
inline bool operator==(const QuantizationInfo &lhs, const QuantizationInfo &rhs)
{
- return (lhs.scale == rhs.scale) && (lhs.offset == rhs.offset);
+ return (lhs.scale() == rhs.scale()) && (lhs.offset() == rhs.offset());
}
/** Check whether two quantization info are not equal.
@@ -245,6 +263,19 @@ inline float dequantize_qasymm8(uint8_t value, const QuantizationInfo &qinfo)
return (static_cast<int>(value) - uqinfo.offset) * uqinfo.scale;
}
+/** Dequantize a value given an asymmetric quantization scheme
+ *
+ * @param[in] value Value to dequantize
+ * @param[in] scale Scale to use for dequantization
+ * @param[in] offset Zero-offset to use for dequantization
+ *
+ * @return Dequantized value
+ */
+inline float dequantize(uint8_t value, float scale, int32_t offset)
+{
+ return (static_cast<int>(value) - offset) * scale;
+}
+
/** Dequantize a value given a symmetric quantization scheme
*
* @param[in] value Value to dequantize
@@ -252,9 +283,21 @@ inline float dequantize_qasymm8(uint8_t value, const QuantizationInfo &qinfo)
*
* @return Dequantized value
*/
-inline float dequantize_qsymm8(int8_t value, const QuantizationInfo &qinfo)
+inline float dequantize_qsymm8(int8_t value, const UniformQuantizationInfo &qinfo)
+{
+ return value * qinfo.scale;
+}
+
+/** Dequantize a value given a symmetric quantization scheme
+ *
+ * @param[in] value Value to dequantize
+ * @param[in] scale Scale to use for dequantization
+ *
+ * @return Dequantized value
+ */
+inline float dequantize(int8_t value, float scale)
{
- return value * qinfo.uniform().scale;
+ return value * scale;
}
/** Quantize a value given a 16-bit symmetric quantization scheme