GROUPED_CONV_2D with per-channel quantization.
A variant of GROUPED_CONV_2D operand that takes:
- TENSOR_QUANT8_ASYMM as input tensor.
- TENSOR_QUANT8_ASYMM as output tensor.
- TENSOR_INT32 as bias tensor.
- TENSOR_QUANT8_SYMM_PER_CHANNEL as filter tensor.
Filter tensor channel dimension has to be 0.
Bias tensor scale value has to be set to 0. Its actual
scaling values depends on value position in the tensor:
bias[d].scale = input_tensor.scale * filter.scales[d]
We may want introduce TENSOR_INT32_PER_CHANNEL for
validation of biases scaling.
+ Fixed some typos in NeuralNetworks.h
Bug: 119255406
Test: NeuralNetworksTest_static
Change-Id: I68d1b2e82ec4faf6e39428909c95d1ca6dc20c60
Merged-In: I68d1b2e82ec4faf6e39428909c95d1ca6dc20c60
(cherry picked from commit 7b3357e6581cf4e86d48b9785920076726b309ba)
diff --git a/common/OperationsUtils.cpp b/common/OperationsUtils.cpp
index d2f2da2..95de6a4 100644
--- a/common/OperationsUtils.cpp
+++ b/common/OperationsUtils.cpp
@@ -1031,7 +1031,11 @@
int32_t padding_left, int32_t padding_right, int32_t padding_top,
int32_t padding_bottom, int32_t stride_width, int32_t stride_height,
int32_t numGroups, Shape* output) {
- NN_OPS_CHECK(input.type == filter.type);
+ if (filter.type == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL) {
+ NN_OPS_CHECK(input.type == OperandType::TENSOR_QUANT8_ASYMM);
+ } else {
+ NN_OPS_CHECK(input.type == filter.type);
+ }
if (input.type == OperandType::TENSOR_QUANT8_ASYMM) {
NN_OPS_CHECK(bias.type == OperandType::TENSOR_INT32);
} else {