[moco] Introduce Conv2D series IR (#7891)
author박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Wed, 2 Oct 2019 03:38:18 +0000 (12:38 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Wed, 2 Oct 2019 03:38:18 +0000 (12:38 +0900)
This will introduce IR for Conv2D, Conv2DBackpropInput and DepthwiseConv2dNative node

Signed-off-by: SaeHie Park <saehie.park@samsung.com>
compiler/moco/lang/include/moco/IR/Nodes/TFConv2D.h [new file with mode: 0644]
compiler/moco/lang/include/moco/IR/Nodes/TFConv2DBackpropInput.h [new file with mode: 0644]
compiler/moco/lang/include/moco/IR/Nodes/TFDepthwiseConv2dNative.h [new file with mode: 0644]
compiler/moco/lang/include/moco/IR/TFNodes.h
compiler/moco/lang/include/moco/IR/TFNodes.lst
compiler/moco/lang/src/IR/Nodes/TFConv2D.test.cpp [new file with mode: 0644]
compiler/moco/lang/src/IR/Nodes/TFConv2DBackpropInput.test.cpp [new file with mode: 0644]
compiler/moco/lang/src/IR/Nodes/TFDepthwiseConv2dNative.test.cpp [new file with mode: 0644]

diff --git a/compiler/moco/lang/include/moco/IR/Nodes/TFConv2D.h b/compiler/moco/lang/include/moco/IR/Nodes/TFConv2D.h
new file mode 100644 (file)
index 0000000..8d7bd71
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2019 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 __MOCO_IR_TFCONV2D_H__
+#define __MOCO_IR_TFCONV2D_H__
+
+#include "moco/IR/TFNodeDecl.h"
+
+#include <vector>
+
+namespace moco
+{
+
+class TFConv2D final : public FixedArityNode<2, TFNodeImpl<TFOpcode::Conv2D>>
+{
+public:
+  loco::Node *input(void) const { return at(0)->node(); }
+  void input(Node *node) { at(0)->node(node); }
+
+  loco::Node *filters(void) const { return at(1)->node(); }
+  void filters(Node *node) { at(1)->node(node); }
+
+public:
+  const TFPadding &padding(void) const { return _padding; }
+  void padding(const TFPadding &padding) { _padding = padding; }
+
+  const TFDataLayout &data_layout(void) const { return _data_layout; }
+  void data_layout(const TFDataLayout &data_layout) { _data_layout = data_layout; }
+
+  const std::vector<int64_t> &strides(void) const { return _strides; }
+  void strides(const std::vector<int64_t> &strides) { _strides = strides; }
+
+private:
+  TFPadding _padding;
+  TFDataLayout _data_layout;
+  std::vector<int64_t> _strides;
+  // TODO Support "Dilation"
+};
+
+} // namespace moco
+
+#endif // __MOCO_IR_TFCONV2D_H__
diff --git a/compiler/moco/lang/include/moco/IR/Nodes/TFConv2DBackpropInput.h b/compiler/moco/lang/include/moco/IR/Nodes/TFConv2DBackpropInput.h
new file mode 100644 (file)
index 0000000..43e620d
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2019 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 __MOCO_IR_TFCONV2DBACKPROPINPUT_H__
+#define __MOCO_IR_TFCONV2DBACKPROPINPUT_H__
+
+#include "moco/IR/TFNodeDecl.h"
+
+#include <vector>
+
+namespace moco
+{
+
+/// @note TFConv2DBackpropInput corresponds to the following GraphDef
+/*
+node {
+  name: "conv2d_backprop_input"
+  op: "Conv2DBackpropInput"
+  input: "input_sizes"
+  input: "filter"
+  input: "out_backprop"
+  attr {
+    key: "T"
+    value { type: DT_FLOAT }
+  }
+  attr {
+    key: "data_format"
+    value { s: "NHWC" }
+  }
+  attr {
+    key: "dilations"
+    value {
+      list { i: 1 i: 1 i: 1 i: 1 }
+    }
+  }
+  attr {
+    key: "padding"
+    value { s: "SAME" }
+  }
+  attr {
+    key: "strides"
+    value {
+      list { i: 1 i: 2 i: 2 i: 1 }
+    }
+  }
+}
+*/
+
+/**
+ * @note  For Tensorflow Conv2DBackpropInput, 'input' refers actual output of the
+ *        node, and 'input' refers actual input. The reasone of this is, as name
+ *        suggests, because it is inspired from backpropagation of convolution.
+ *        For example, 'out_backprop' of Conv2DBackpropInput is its actual input
+ *        feature map, and 'input_sizes' means desired output node's size.
+ *        Note that this convention is against loco canonical's convention.
+ */
+class TFConv2DBackpropInput final
+    : public FixedArityNode<3, TFNodeImpl<TFOpcode::Conv2DBackpropInput>>
+{
+public:
+  loco::Node *input_sizes(void) const { return at(0)->node(); }
+  void input_sizes(Node *node) { at(0)->node(node); }
+
+  loco::Node *filter(void) const { return at(1)->node(); }
+  void filter(Node *node) { at(1)->node(node); }
+
+  loco::Node *out_backprop(void) const { return at(2)->node(); }
+  void out_backprop(Node *node) { at(2)->node(node); }
+
+public:
+  const TFPadding &padding(void) const { return _padding; }
+  void padding(const TFPadding &padding) { _padding = padding; }
+
+  const TFDataLayout &data_layout(void) const { return _data_layout; }
+  void data_layout(const TFDataLayout &data_layout) { _data_layout = data_layout; }
+
+  const std::vector<int64_t> &strides(void) const { return _strides; }
+  void strides(const std::vector<int64_t> &strides) { _strides = strides; }
+
+private:
+  TFPadding _padding;
+  TFDataLayout _data_layout;
+  std::vector<int64_t> _strides;
+  // TODO Support "Dilation"
+};
+
+} // namespace moco
+
+#endif // __MOCO_IR_TFCONV2DBACKPROPINPUT_H__
diff --git a/compiler/moco/lang/include/moco/IR/Nodes/TFDepthwiseConv2dNative.h b/compiler/moco/lang/include/moco/IR/Nodes/TFDepthwiseConv2dNative.h
new file mode 100644 (file)
index 0000000..35ac76f
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2019 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 __MOCO_IR_TFDEPTHWISECONV2DNATIVE_H__
+#define __MOCO_IR_TFDEPTHWISECONV2DNATIVE_H__
+
+#include "moco/IR/TFNodeDecl.h"
+
+#include <vector>
+
+namespace moco
+{
+
+class TFDepthwiseConv2dNative final
+    : public FixedArityNode<2, TFNodeImpl<TFOpcode::DepthwiseConv2dNative>>
+{
+public:
+  loco::Node *input(void) const { return at(0)->node(); }
+  void input(Node *node) { at(0)->node(node); }
+
+  loco::Node *filter(void) const { return at(1)->node(); }
+  void filter(Node *node) { at(1)->node(node); }
+
+public:
+  const TFPadding &padding(void) const { return _padding; }
+  void padding(const TFPadding &padding) { _padding = padding; }
+
+  const TFDataLayout &data_layout(void) const { return _data_layout; }
+  void data_layout(const TFDataLayout &data_layout) { _data_layout = data_layout; }
+
+  const std::vector<int64_t> &strides(void) const { return _strides; }
+  void strides(const std::vector<int64_t> &strides) { _strides = strides; }
+
+private:
+  TFPadding _padding;
+  TFDataLayout _data_layout;
+  std::vector<int64_t> _strides;
+  // TODO Support "Dilation"
+};
+
+} // namespace moco
+
+#endif // __MOCO_TF_IR_TFDEPTHWISECONV2DNATIVE_H__
index cb1d3b1..80d2e0f 100644 (file)
@@ -22,9 +22,9 @@
 #include "moco/IR/Nodes/TFBiasAdd.h"
 //#include "moco/IR/Nodes/TFConcatV2.h"
 //#include "moco/IR/Nodes/TFConst.h"
-//#include "moco/IR/Nodes/TFConv2D.h"
-//#include "moco/IR/Nodes/TFConv2DBackpropInput.h"
-//#include "moco/IR/Nodes/TFDepthwiseConv2dNative.h"
+#include "moco/IR/Nodes/TFConv2D.h"
+#include "moco/IR/Nodes/TFConv2DBackpropInput.h"
+#include "moco/IR/Nodes/TFDepthwiseConv2dNative.h"
 //#include "moco/IR/Nodes/TFFusedBatchNorm.h"
 //#include "moco/IR/Nodes/TFIdentity.h"
 //#include "moco/IR/Nodes/TFMaxPool.h"
index 9132cd8..78f4db8 100644 (file)
@@ -12,9 +12,9 @@ TENSORFLOW_NODE(AvgPool, TFAvgPool)
 TENSORFLOW_NODE(BiasAdd, TFBiasAdd)
 //TENSORFLOW_NODE(ConcatV2, TFConcatV2)
 //TENSORFLOW_NODE(Const, TFConst)
-//TENSORFLOW_NODE(Conv2D, TFConv2D)
-//TENSORFLOW_NODE(Conv2DBackpropInput, TFConv2DBackpropInput)
-//TENSORFLOW_NODE(DepthwiseConv2dNative, TFDepthwiseConv2dNative)
+TENSORFLOW_NODE(Conv2D, TFConv2D)
+TENSORFLOW_NODE(Conv2DBackpropInput, TFConv2DBackpropInput)
+TENSORFLOW_NODE(DepthwiseConv2dNative, TFDepthwiseConv2dNative)
 //TENSORFLOW_NODE(FusedBatchNorm, TFFusedBatchNorm)
 //TENSORFLOW_NODE(Identity, TFIdentity)
 //TENSORFLOW_NODE(MaxPool, TFMaxPool)
diff --git a/compiler/moco/lang/src/IR/Nodes/TFConv2D.test.cpp b/compiler/moco/lang/src/IR/Nodes/TFConv2D.test.cpp
new file mode 100644 (file)
index 0000000..28a8133
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+#include "moco/IR/Nodes/TFConv2D.h"
+#include "moco/IR/TFDialect.h"
+
+#include <gtest/gtest.h>
+
+TEST(TFConv2DTest, constructor)
+{
+  moco::TFConv2D conv2d_node;
+
+  ASSERT_EQ(conv2d_node.dialect(), moco::TFDialect::get());
+  ASSERT_EQ(conv2d_node.opcode(), moco::TFOpcode::Conv2D);
+
+  ASSERT_EQ(conv2d_node.input(), nullptr);
+  ASSERT_EQ(conv2d_node.filters(), nullptr);
+  ASSERT_EQ(conv2d_node.padding(), "");
+  ASSERT_EQ(conv2d_node.data_layout(), "");
+  ASSERT_EQ(conv2d_node.strides().size(), 0);
+}
diff --git a/compiler/moco/lang/src/IR/Nodes/TFConv2DBackpropInput.test.cpp b/compiler/moco/lang/src/IR/Nodes/TFConv2DBackpropInput.test.cpp
new file mode 100644 (file)
index 0000000..f7ad4ce
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+#include "moco/IR/Nodes/TFConv2DBackpropInput.h"
+#include "moco/IR/TFDialect.h"
+
+#include <gtest/gtest.h>
+
+TEST(TFConv2DBackpropInputTest, constructor)
+{
+  moco::TFConv2DBackpropInput conv2dbi_node;
+
+  ASSERT_EQ(conv2dbi_node.dialect(), moco::TFDialect::get());
+  ASSERT_EQ(conv2dbi_node.opcode(), moco::TFOpcode::Conv2DBackpropInput);
+
+  ASSERT_EQ(conv2dbi_node.input_sizes(), nullptr);
+  ASSERT_EQ(conv2dbi_node.filter(), nullptr);
+  ASSERT_EQ(conv2dbi_node.out_backprop(), nullptr);
+  ASSERT_EQ(conv2dbi_node.padding(), "");
+  ASSERT_EQ(conv2dbi_node.data_layout(), "");
+  ASSERT_EQ(conv2dbi_node.strides().size(), 0);
+}
diff --git a/compiler/moco/lang/src/IR/Nodes/TFDepthwiseConv2dNative.test.cpp b/compiler/moco/lang/src/IR/Nodes/TFDepthwiseConv2dNative.test.cpp
new file mode 100644 (file)
index 0000000..2562997
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+#include "moco/IR/Nodes/TFDepthwiseConv2dNative.h"
+#include "moco/IR/TFDialect.h"
+
+#include <gtest/gtest.h>
+
+TEST(TFDepthwiseConv2dNativeTest, constructor)
+{
+  moco::TFDepthwiseConv2dNative depthwiseConv2dnative_node;
+
+  ASSERT_EQ(depthwiseConv2dnative_node.dialect(), moco::TFDialect::get());
+  ASSERT_EQ(depthwiseConv2dnative_node.opcode(), moco::TFOpcode::DepthwiseConv2dNative);
+
+  ASSERT_EQ(depthwiseConv2dnative_node.input(), nullptr);
+  ASSERT_EQ(depthwiseConv2dnative_node.filter(), nullptr);
+  ASSERT_EQ(depthwiseConv2dnative_node.padding(), "");
+  ASSERT_EQ(depthwiseConv2dnative_node.data_layout(), "");
+  ASSERT_EQ(depthwiseConv2dnative_node.strides().size(), 0);
+}