[exo] Export TFLMean (#8740)
author박천교/On-Device Lab(SR)/Engineer/삼성전자 <ch.bahk@samsung.com>
Tue, 5 Nov 2019 01:40:43 +0000 (10:40 +0900)
committer박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Tue, 5 Nov 2019 01:40:43 +0000 (10:40 +0900)
This commit implements export stage of TFLMean for both tflite and
circle output

Signed-off-by: Cheongyo Bahk <ch.bahk@samsung.com>
compiler/exo/src/Circle/CircleOperationExporter.cpp
compiler/exo/src/TFLite/TFLOperationExporter.cpp

index 42820ee..7b8c636 100644 (file)
@@ -59,6 +59,7 @@ public:
   void visit(locoex::TFLDepthwiseConv2D *) final;
   void visit(locoex::TFLDiv *) final;
   void visit(locoex::TFLMaxPool2D *) final;
+  void visit(locoex::TFLMean *) final;
   void visit(locoex::TFLMul *) final;
   void visit(locoex::TFLRelu *) final;
   void visit(locoex::TFLRelu6 *) final;
@@ -214,6 +215,20 @@ void OperationExporter::visit(locoex::TFLMaxPool2D *node)
   export_pool_2d<locoex::TFLMaxPool2D>(node, circle::BuiltinOperator_MAX_POOL_2D);
 }
 
+void OperationExporter::visit(locoex::TFLMean *node)
+{
+  uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_MEAN);
+  std::vector<int32_t> inputs_vec{get_tensor_index(node->input()),
+                                  get_tensor_index(node->reduction_indices())};
+  std::vector<int32_t> outputs_vec{get_tensor_index(static_cast<loco::Node *>(node))};
+  auto inputs = builder.CreateVector(inputs_vec);
+  auto outputs = builder.CreateVector(outputs_vec);
+  auto options = CreateReducerOptions(builder, node->keep_dims());
+  auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
+                                  circle::BuiltinOptions_ReducerOptions, options.Union());
+  gd._operators.push_back(op_offset);
+}
+
 void OperationExporter::visit(locoex::TFLMul *node)
 {
   uint32_t op_idx = gd.registerBuiltinOpcode(circle::BuiltinOperator_MUL);
index 0a2c8f9..6a56e8b 100644 (file)
@@ -59,6 +59,7 @@ public:
   void visit(locoex::TFLDepthwiseConv2D *) final;
   void visit(locoex::TFLDiv *) final;
   void visit(locoex::TFLMaxPool2D *) final;
+  void visit(locoex::TFLMean *) final;
   void visit(locoex::TFLMul *) final;
   void visit(locoex::TFLRelu *) final;
   void visit(locoex::TFLRelu6 *) final;
@@ -214,6 +215,20 @@ void OperationExporter::visit(locoex::TFLMaxPool2D *node)
   export_pool_2d<locoex::TFLMaxPool2D>(node, tflite::BuiltinOperator_MAX_POOL_2D);
 }
 
+void OperationExporter::visit(locoex::TFLMean *node)
+{
+  uint32_t op_idx = gd.registerBuiltinOpcode(tflite::BuiltinOperator_MEAN);
+  std::vector<int32_t> inputs_vec{get_tensor_index(node->input()),
+                                  get_tensor_index(node->reduction_indices())};
+  std::vector<int32_t> outputs_vec{get_tensor_index(static_cast<loco::Node *>(node))};
+  auto inputs = builder.CreateVector(inputs_vec);
+  auto outputs = builder.CreateVector(outputs_vec);
+  auto options = CreateReducerOptions(builder, node->keep_dims());
+  auto op_offset = CreateOperator(builder, op_idx, inputs, outputs,
+                                  tflite::BuiltinOptions_ReducerOptions, options.Union());
+  gd._operators.push_back(op_offset);
+}
+
 void OperationExporter::visit(locoex::TFLMul *node)
 {
   uint32_t op_idx = gd.registerBuiltinOpcode(tflite::BuiltinOperator_MUL);