Check if the operation requires explict conversion from int8 to uint8 values.
| 135 | |
| 136 | // Check if the operation requires explict conversion from int8 to uint8 values. |
| 137 | bool NeedInt8Conversion(const TfLiteContext* context, int builtin_code, |
| 138 | const TfLiteNode* node) { |
| 139 | const int input_id = node->inputs->data[0]; |
| 140 | const TfLiteType input_type = context->tensors[input_id].type; |
| 141 | switch (builtin_code) { |
| 142 | case kTfLiteBuiltinConv2d: |
| 143 | case kTfLiteBuiltinDepthwiseConv2d: |
| 144 | case kTfLiteBuiltinFullyConnected: { |
| 145 | if (input_type == kTfLiteInt8) { |
| 146 | const int weights_id = node->inputs->data[1]; |
| 147 | const auto& weights_tensor = context->tensors[weights_id]; |
| 148 | if ((weights_tensor.type == kTfLiteInt8 || |
| 149 | weights_tensor.type == kTfLiteUInt8) && |
| 150 | weights_tensor.quantization.type == kTfLiteAffineQuantization) { |
| 151 | return true; |
| 152 | } |
| 153 | } |
| 154 | return false; |
| 155 | } |
| 156 | case kTfLiteBuiltinSelect: { |
| 157 | const auto value_type = context->tensors[node->inputs->data[1]].type; |
| 158 | return value_type == kTfLiteInt8; |
| 159 | } |
| 160 | case kTfLiteBuiltinAdd: |
| 161 | case kTfLiteBuiltinArgMax: |
| 162 | case kTfLiteBuiltinArgMin: |
| 163 | case kTfLiteBuiltinAveragePool2d: |
| 164 | case kTfLiteBuiltinBatchToSpaceNd: |
| 165 | case kTfLiteBuiltinConcatenation: |
| 166 | case kTfLiteBuiltinEqual: |
| 167 | case kTfLiteBuiltinExpandDims: |
| 168 | case kTfLiteBuiltinGreater: |
| 169 | case kTfLiteBuiltinGreaterEqual: |
| 170 | case kTfLiteBuiltinL2Normalization: |
| 171 | case kTfLiteBuiltinLess: |
| 172 | case kTfLiteBuiltinLessEqual: |
| 173 | case kTfLiteBuiltinLogistic: |
| 174 | case kTfLiteBuiltinMaximum: |
| 175 | case kTfLiteBuiltinMaxPool2d: |
| 176 | case kTfLiteBuiltinMean: |
| 177 | case kTfLiteBuiltinMinimum: |
| 178 | case kTfLiteBuiltinMul: |
| 179 | case kTfLiteBuiltinNotEqual: |
| 180 | case kTfLiteBuiltinPad: |
| 181 | case kTfLiteBuiltinPadv2: |
| 182 | case kTfLiteBuiltinReduceMax: |
| 183 | case kTfLiteBuiltinReduceMin: |
| 184 | case kTfLiteBuiltinRelu: |
| 185 | case kTfLiteBuiltinReluN1To1: |
| 186 | case kTfLiteBuiltinRelu6: |
| 187 | case kTfLiteBuiltinResizeBilinear: |
| 188 | case kTfLiteBuiltinResizeNearestNeighbor: |
| 189 | case kTfLiteBuiltinReshape: |
| 190 | case kTfLiteBuiltinSlice: |
| 191 | case kTfLiteBuiltinSoftmax: |
| 192 | case kTfLiteBuiltinSpaceToBatchNd: |
| 193 | case kTfLiteBuiltinSpaceToDepth: |
| 194 | case kTfLiteBuiltinDepthToSpace: |