in lib/Importer/TFLiteModelLoader.cpp [1158:1398]
Error TFLiteModelLoader::loadOperator(const tflite::Operator *op,
const OperatorInfo &opInfo) {
// Opcodes are treated in increasing order to allow easy tracking
// for which operators are supported and which are not.
auto opCode = opInfo.code;
if (opCode == tflite::BuiltinOperator_ADD) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_AVERAGE_POOL_2D) {
return loadPool2D(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_CONCATENATION) {
return loadConcat(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_CONV_2D) {
return loadConv2D(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_DEPTHWISE_CONV_2D) {
return loadDepthwiseConv2D(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_DEQUANTIZE) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_HARD_SWISH) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_FLOOR) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_FULLY_CONNECTED) {
return loadFullyConnected(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LOGISTIC) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_MAX_POOL_2D) {
return loadPool2D(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_MUL) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_RELU) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_RELU_N1_TO_1) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_RELU6) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_RESHAPE) {
return loadReshape(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SOFTMAX) {
return loadSoftmax(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LOG_SOFTMAX) {
return loadLogSoftmax(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_TANH) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_PAD) {
return loadPad(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_TRANSPOSE) {
return loadTranspose(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_MEAN) {
return loadReduce(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SUB) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_DIV) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SQUEEZE) {
return loadReshape(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_STRIDED_SLICE) {
return loadStridedSlice(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_EXP) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SPLIT) {
return loadSplit(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_PRELU) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_MAXIMUM) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_ARG_MAX) {
return loadArg(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_MINIMUM) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LESS) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_NEG) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_GREATER) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_GREATER_EQUAL) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LESS_EQUAL) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SLICE) {
return loadSlice(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_RESIZE_BILINEAR) {
return loadResizeBilinear(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR) {
return loadResizeNearest(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SPACE_TO_DEPTH) {
return loadSpaceToDepth(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_DEPTH_TO_SPACE) {
return loadDepthToSpace(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_CAST) {
return loadCast(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_GATHER) {
return loadGather(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_GATHER_ND) {
return loadGatherND(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SELECT) {
return loadSelect(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SPACE_TO_BATCH_ND) {
return loadSpaceToBatchNd(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_BATCH_TO_SPACE_ND) {
return loadBatchToSpaceNd(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SIN) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_TILE) {
return loadTile(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_EXPAND_DIMS) {
return loadReshape(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_EQUAL) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_NOT_EQUAL) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LOG) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SQRT) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_RSQRT) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SHAPE) {
return loadShape(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_POW) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_ARG_MIN) {
return loadArg(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_PACK) {
return loadPack(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LOGICAL_OR) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LOGICAL_AND) {
return loadBinaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LOGICAL_NOT) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_UNPACK) {
return loadUnpack(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_SQUARE) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_LEAKY_RELU) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_ABS) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_CEIL) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_COS) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_QUANTIZE) {
return loadUnaryArithmetic(op, opInfo);
}
if (opCode == tflite::BuiltinOperator_ROUND) {
return loadUnaryArithmetic(op, opInfo);
}
// Load custom operators.
if (opCode == tflite::BuiltinOperator_CUSTOM) {
// Get custom operator code.
std::string customOpCode;
ASSIGN_VALUE_OR_RETURN_ERR(customOpCode, getOperatorCustomCode(op));
// Get custom operator options.
flexbuffers::Map opts = flexbuffers::Map::EmptyMap();
ASSIGN_VALUE_OR_RETURN_ERR(opts, getOperatorCustomOpts(op));
// Load custom operator.
if (customOpCode == "TFLite_Detection_PostProcess") {
return loadTFLiteDetectionPostProcess(op, opInfo, opts);
}
if (customOpCode == "AudioSpectrogram") {
return loadTFLiteAudioSpectrogram(op, opInfo, opts);
}
if (customOpCode == "Mfcc") {
return loadTFLiteMFCC(op, opInfo, opts);
}
}
return MAKE_ERR(
strFormat("TensorFlowLite: Operator type '%s' is not supported!",
opInfo.type.c_str()));
}