[tfldump] dump operator options (#2516)
author박세희/동작제어Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Thu, 6 Dec 2018 01:16:14 +0000 (10:16 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 6 Dec 2018 01:16:14 +0000 (10:16 +0900)
This will add to dump operator options for each operator codes

Signed-off-by: SaeHie Park <saehie.park@samsung.com>
contrib/tfldump/CMakeLists.txt
contrib/tfldump/src/Dump.cpp
contrib/tfldump/src/DumpOp.cpp

index 731acd2..7e3f1b6 100644 (file)
@@ -17,3 +17,4 @@ add_executable(tfldump ${DRIVER} ${SOURCES})
 target_include_directories(tfldump PRIVATE include)
 target_link_libraries(tfldump tfldump_flatbuffer)
 target_link_libraries(tfldump safemain)
+target_link_libraries(tfldump stdex)
index 25975e4..7046c53 100644 (file)
@@ -170,6 +170,7 @@ void dump_model(std::ostream &os, const tflite::Model *model)
 
   // dump operators
   os << "Operators: O(operator index) OpCodeName " << std::endl;
+  os << "    Option(values) ... <-- depending on OpCode" << std::endl;
   os << "    I T(tensor index) OperandName <-- as input" << std::endl;
   os << "    O T(tensor index) OperandName <-- as output" << std::endl;
   for (uint32_t i = 0; i < operators->Length(); ++i)
index 3c0d2e8..fea0243 100644 (file)
  */
 
 #include "DumpOp.h"
+#include "Read.h"
+
+#include <stdex/Memory.h>
+
+using stdex::make_unique;
 
 namespace tfldump
 {
 
+// TODO move to some header
+std::ostream &operator<<(std::ostream &os, const std::vector<int32_t> &vect);
+
+class DumpOpConv2D : public DumpOp
+{
+public:
+  void options(const tflite::Operator *op, std::ostream &os) const override
+  {
+    if (auto conv_params = op->builtin_options_as_Conv2DOptions())
+    {
+      os << "    ";
+      os << "Padding(" << conv_params->padding() << ") ";
+      os << "Stride.W(" << conv_params->stride_w() << ") ";
+      os << "Stride.H(" << conv_params->stride_h() << ") ";
+      os << "Activation(" << conv_params->fused_activation_function() << ")";
+      os << std::endl;
+    }
+  }
+};
+
+class DumpOpPool2D : public DumpOp
+{
+public:
+  void options(const tflite::Operator *op, std::ostream &os) const override
+  {
+    if (auto pool_params = op->builtin_options_as_Pool2DOptions())
+    {
+      os << "    ";
+      os << "Padding(" << pool_params->padding() << ") ";
+      os << "Stride.W(" << pool_params->stride_w() << ") ";
+      os << "Stride.H(" << pool_params->stride_h() << ") ";
+      os << "Filter.W(" << pool_params->filter_width() << ") ";
+      os << "Filter.H(" << pool_params->filter_height() << ") ";
+      os << "Activation(" << pool_params->fused_activation_function() << ")";
+      os << std::endl;
+    }
+  }
+};
+
+class DumpOpConcatenation : public DumpOp
+{
+public:
+  void options(const tflite::Operator *op, std::ostream &os) const override
+  {
+    if (auto *concatenation_params = op->builtin_options_as_ConcatenationOptions())
+    {
+      os << "    ";
+      os << "Activation(" << concatenation_params->fused_activation_function() << ") ";
+      os << "Axis(" << concatenation_params->axis() << ")";
+      os << std::endl;
+    }
+  }
+};
+
+class DumpOpReshape : public DumpOp
+{
+public:
+  void options(const tflite::Operator *op, std::ostream &os) const override
+  {
+    if (auto *reshape_params = op->builtin_options_as_ReshapeOptions())
+    {
+      auto new_shape = tflread::as_index_vector(reshape_params->new_shape());
+      os << "    ";
+      os << "NewShape(" << new_shape << ")";
+      os << std::endl;
+    }
+  }
+};
+
+class DumpOpDepthwiseConv2D : public DumpOp
+{
+public:
+  void options(const tflite::Operator *op, std::ostream &os) const override
+  {
+    if (auto conv_params = op->builtin_options_as_DepthwiseConv2DOptions())
+    {
+      os << "    ";
+      os << "Padding(" << conv_params->padding() << ") ";
+      os << "Stride.W(" << conv_params->stride_w() << ") ";
+      os << "Stride.H(" << conv_params->stride_h() << ") ";
+      os << "DepthMultiplier(" << conv_params->depth_multiplier() << ") ";
+      os << "Activation(" << conv_params->fused_activation_function() << ") ";
+      os << "Dilation.W(" << conv_params->dilation_w_factor() << ") ";
+      os << "Dilation.H(" << conv_params->dilation_h_factor() << ")";
+      os << std::endl;
+    }
+  }
+};
+
+class DumpOpSoftmax : public DumpOp
+{
+public:
+  void options(const tflite::Operator *op, std::ostream &os) const override
+  {
+    if (auto *softmax_params = op->builtin_options_as_SoftmaxOptions())
+    {
+      os << "    ";
+      os << "Beta(" << softmax_params->beta() << ")";
+      os << std::endl;
+    }
+  }
+};
+
 DumpOpRegistry::DumpOpRegistry()
 {
-  // TODO fill map
+  _dumpop_map[tflite::BuiltinOperator_AVERAGE_POOL_2D] = make_unique<DumpOpPool2D>();
+  _dumpop_map[tflite::BuiltinOperator_CONCATENATION] = make_unique<DumpOpConcatenation>();
+  _dumpop_map[tflite::BuiltinOperator_CONV_2D] = make_unique<DumpOpConv2D>();
+  _dumpop_map[tflite::BuiltinOperator_DEPTHWISE_CONV_2D] = make_unique<DumpOpDepthwiseConv2D>();
+  _dumpop_map[tflite::BuiltinOperator_MAX_POOL_2D] = make_unique<DumpOpPool2D>();
+  // There is no Option for ReLU and ReLU6
+  _dumpop_map[tflite::BuiltinOperator_RESHAPE] = make_unique<DumpOpReshape>();
+  _dumpop_map[tflite::BuiltinOperator_SOFTMAX] = make_unique<DumpOpSoftmax>();
 }
 
 } // namespace tfldump