[tflchef] Support explicit initialization over INT32 tensors (#2408)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Mon, 26 Nov 2018 09:46:24 +0000 (18:46 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Mon, 26 Nov 2018 09:46:24 +0000 (18:46 +0900)
* [tflchef] Support explicit initialization over INT32 tensors

This commit introduces 'explicit' filler which allows users to
explicitly specifies the values of operands.

Currently, 'explicit' filler is available for INT32 types.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
* Use -1 as a new_shape parameter

contrib/tflchef/core/src/Data/Explicit.h [new file with mode: 0644]
contrib/tflchef/core/src/DataChef.def
contrib/tflchef/core/src/DataChefs.h
contrib/tflchef/core/src/LexicalCast.cpp
contrib/tflchef/core/src/ModelChef.cpp
contrib/tflchef/tests/explicit_datachef/test.recipe [new file with mode: 0644]

diff --git a/contrib/tflchef/core/src/Data/Explicit.h b/contrib/tflchef/core/src/Data/Explicit.h
new file mode 100644 (file)
index 0000000..f4175f4
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EXPLICIT_FILLER_H__
+#define __EXPLICIT_FILLER_H__
+
+#include "DataChef.h"
+#include "LexicalCast.h"
+
+#include <vector>
+
+/**
+ * @brief Return the identity of arithmetic addition
+ */
+template <typename T> T zero(void);
+
+template <> int zero(void) { return 0; }
+
+template <typename T> class ExplicitDataChef final : public DataChef
+{
+public:
+  ExplicitDataChef()
+  {
+    // DO NOTHING
+  }
+
+public:
+  std::vector<uint8_t> generate(int32_t count) const override
+  {
+    std::vector<uint8_t> res;
+
+    for (uint32_t n = 0; n < count; ++n)
+    {
+      T const value = (n < _values.size()) ? _values.at(n) : zero<T>();
+      const uint8_t *arr = reinterpret_cast<const uint8_t *>(&value);
+
+      for (uint32_t b = 0; b < sizeof(T); ++b)
+      {
+        res.emplace_back(arr[b]);
+      }
+    }
+
+    return res;
+  }
+
+public:
+  void insert(const T &value) { _values.emplace_back(value); }
+
+private:
+  std::vector<T> _values;
+};
+
+template <typename T> struct ExplicitDataChefFactory : public DataChefFactory
+{
+  std::unique_ptr<DataChef> create(const Arguments &args) const
+  {
+    std::unique_ptr<ExplicitDataChef<T>> res{new ExplicitDataChef<T>};
+
+    for (uint32_t n = 0; n < args.count(); ++n)
+    {
+      auto const value = to_number<T>(args.value(n));
+      res->insert(value);
+    }
+
+    return std::move(res);
+  }
+};
+
+#endif // __EXPLICIT_FILLER_H__
index 10a8b33..9e89497 100644 (file)
@@ -5,4 +5,5 @@
 // DATA_CHEF(TYPE, NAME, FACTORY_CLASS)
 //  "TYPE" SHOULD BE an enum tag of tflchef::TensorType
 DATA_CHEF(FLOAT32, constant, ConstantDataChefFactory<float>)
+DATA_CHEF(INT32, explicit, ExplicitDataChefFactory<int>)
 DATA_CHEF(FLOAT32, gaussian, GaussianFloat32DataChefFactory)
index ca9b31e..2310ae8 100644 (file)
@@ -18,6 +18,7 @@
 #define __DATA_CHEFS_H__
 
 #include "Data/Constant.h"
+#include "Data/Explicit.h"
 #include "Data/Gaussian.h"
 
 #endif // __DATA_CHEFS_H__
index 4709088..334729d 100644 (file)
@@ -17,3 +17,4 @@
 #include "LexicalCast.h"
 
 template <> float to_number(const std::string &s) { return std::stof(s); }
+template <> int to_number(const std::string &s) { return std::stoi(s); }
index c6feba1..ba09cfb 100644 (file)
@@ -165,10 +165,13 @@ struct DataChefRegistry final : public Registry<DataChefFactory>
 
 DataChefRegistry &data_chef_registry(const tflchef::TensorType &type)
 {
+  static DataChefRegistry s32;
   static DataChefRegistry fp32;
 
   switch (type)
   {
+  case tflchef::INT32:
+    return s32;
   case tflchef::FLOAT32:
     return fp32;
   default:
diff --git a/contrib/tflchef/tests/explicit_datachef/test.recipe b/contrib/tflchef/tests/explicit_datachef/test.recipe
new file mode 100644 (file)
index 0000000..bd5213f
--- /dev/null
@@ -0,0 +1,28 @@
+operand {
+  name: "ifm"
+  type: FLOAT32
+  shape { dim: 1 dim: 1 dim: 1 dim: 10 }
+}
+operand {
+  name: "shape"
+  type: INT32
+  shape { dim: 2 }
+  filler { tag: "explicit" arg: "-1" arg: "10" }
+}
+operand {
+  name: "ofm"
+  type: FLOAT32
+  shape { dim: 1 dim: 10 }
+}
+operation {
+  type: "Reshape"
+  reshape_options {
+    new_shape: -1
+    new_shape: 10
+  }
+  input: "ifm"
+  input: "shape"
+  output: "ofm"
+}
+input: "ifm"
+output: "ofm"