From 35f1134d4ebc148699585dbc7f1db6da17e649bd Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=B2=9C=EA=B5=90/On-Device=20Lab=28SR=29/Enginee?= =?utf8?q?r/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Fri, 14 Jun 2019 18:09:05 +0900 Subject: [PATCH] [loco exporter] FeatureCodec identity export (#3795) Previously FeatureCodec nodes tried to be deleted when they are identity, but that was not successful. This commit export those as identity, i.e. CONCATENTATION with one input. Signed-off-by: Cheongyo Bahk --- contrib/loco-exporter/src/OperationExporter.cpp | 42 +++++++++++++++++++------ contrib/loco-exporter/src/TensorExporter.cpp | 26 ++------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/contrib/loco-exporter/src/OperationExporter.cpp b/contrib/loco-exporter/src/OperationExporter.cpp index 9790703..72073fc 100644 --- a/contrib/loco-exporter/src/OperationExporter.cpp +++ b/contrib/loco-exporter/src/OperationExporter.cpp @@ -53,6 +53,22 @@ void exportMaxPool2D(loco::MaxPool2D *node, FlatBufferBuilder &builder, Serializ gd._operators.push_back(op_offset); } +/// @brief Export given node into identity, i.e. CONCATENATION with one input +template +void exportIdentity(NodeT *node, FlatBufferBuilder &builder, SerializedModelData &gd) +{ + uint32_t op_idx = gd.registerBuiltinOpcode(tflite::BuiltinOperator_CONCATENATION); + std::vector inputs_vec{gd._node_to_tensor_id[node->arg(0)]}; + std::vector outputs_vec{gd._node_to_tensor_id[static_cast(node)]}; + auto inputs = builder.CreateVector(inputs_vec); + auto outputs = builder.CreateVector(outputs_vec); + auto options = CreateConcatenationOptions(builder); // use dummy 0 axis and NONE activation + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, + tflite::BuiltinOptions_ConcatenationOptions, options.Union()); + + gd._operators.push_back(op_offset); +} + void exportPermutation(loco::Node *node, FlatBufferBuilder &builder, loco::Permutation *perm, bool inverted, SerializedModelData &gd) @@ -121,11 +137,14 @@ void exportFeatureEncode(loco::FeatureEncode *node, FlatBufferBuilder &builder, { auto perm_descr = dynamic_cast *>(node->encoder()); if (isIdentity(perm_descr)) - return; - // This encode is not an identity, need to insert permutation - - auto *perm = perm_descr->perm(); - exportPermutation(node, builder, perm, /*inverted*/ false, gd); + { + exportIdentity(node, builder, gd); + } + else + { + auto *perm = perm_descr->perm(); + exportPermutation(node, builder, perm, /*inverted*/ false, gd); + } } void exportFeatureDecode(loco::FeatureDecode *node, FlatBufferBuilder &builder, @@ -133,11 +152,14 @@ void exportFeatureDecode(loco::FeatureDecode *node, FlatBufferBuilder &builder, { auto perm_descr = dynamic_cast *>(node->decoder()); if (isIdentity(perm_descr)) - return; - // This encode is not an identity, need to insert permutation - - auto *perm = perm_descr->perm(); - exportPermutation(node, builder, perm, /*inverted*/ true, gd); + { + exportIdentity(node, builder, gd); + } + else + { + auto *perm = perm_descr->perm(); + exportPermutation(node, builder, perm, /*inverted*/ true, gd); + } } void exportNode(loco::Node *node, flatbuffers::FlatBufferBuilder &builder, diff --git a/contrib/loco-exporter/src/TensorExporter.cpp b/contrib/loco-exporter/src/TensorExporter.cpp index d8cf4eb..4f4e261 100644 --- a/contrib/loco-exporter/src/TensorExporter.cpp +++ b/contrib/loco-exporter/src/TensorExporter.cpp @@ -121,33 +121,11 @@ void exportOpDefinedTensors(loco::Graph::NodeContext *nodes, FlatBufferBuilder & } else if (auto *encode = dynamic_cast(node)) { - // If encode node is identity - do nothing, otherwise create tensor to store transposed data - auto *perm_descr = - dynamic_cast *>(encode->encoder()); - assert(perm_descr && "unsupporter encoder"); - if (isIdentity(perm_descr)) - { - gd._node_to_tensor_id[node] = gd._node_to_tensor_id[node->arg(0)]; - } - else - { - exportOpDefinedTensor(encode, builder, gd); - } + exportOpDefinedTensor(encode, builder, gd); } else if (auto *decode = dynamic_cast(node)) { - // If decode node is identity - do nothing, otherwise create tensor to store transposed data - auto *perm_descr = - dynamic_cast *>(decode->decoder()); - assert(perm_descr && "unsupporter decoder"); - if (isIdentity(perm_descr)) - { - gd._node_to_tensor_id[node] = gd._node_to_tensor_id[node->arg(0)]; - } - else - { - exportOpDefinedTensor(decode, builder, gd); - } + exportOpDefinedTensor(decode, builder, gd); } else if (auto *pool = dynamic_cast(node)) { -- 2.7.4