From: 박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 Date: Wed, 2 Oct 2019 03:38:18 +0000 (+0900) Subject: [moco] Introduce Conv2D series IR (#7891) X-Git-Tag: submit/tizen/20191205.083104~964 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d7966071fb8533fbb6e8f82cc57356fbf1cb6fd7;p=platform%2Fcore%2Fml%2Fnnfw.git [moco] Introduce Conv2D series IR (#7891) This will introduce IR for Conv2D, Conv2DBackpropInput and DepthwiseConv2dNative node Signed-off-by: SaeHie Park --- 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 index 0000000..8d7bd71 --- /dev/null +++ b/compiler/moco/lang/include/moco/IR/Nodes/TFConv2D.h @@ -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 + +namespace moco +{ + +class TFConv2D final : public FixedArityNode<2, TFNodeImpl> +{ +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 &strides(void) const { return _strides; } + void strides(const std::vector &strides) { _strides = strides; } + +private: + TFPadding _padding; + TFDataLayout _data_layout; + std::vector _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 index 0000000..43e620d --- /dev/null +++ b/compiler/moco/lang/include/moco/IR/Nodes/TFConv2DBackpropInput.h @@ -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 + +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> +{ +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 &strides(void) const { return _strides; } + void strides(const std::vector &strides) { _strides = strides; } + +private: + TFPadding _padding; + TFDataLayout _data_layout; + std::vector _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 index 0000000..35ac76f --- /dev/null +++ b/compiler/moco/lang/include/moco/IR/Nodes/TFDepthwiseConv2dNative.h @@ -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 + +namespace moco +{ + +class TFDepthwiseConv2dNative final + : public FixedArityNode<2, TFNodeImpl> +{ +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 &strides(void) const { return _strides; } + void strides(const std::vector &strides) { _strides = strides; } + +private: + TFPadding _padding; + TFDataLayout _data_layout; + std::vector _strides; + // TODO Support "Dilation" +}; + +} // namespace moco + +#endif // __MOCO_TF_IR_TFDEPTHWISECONV2DNATIVE_H__ diff --git a/compiler/moco/lang/include/moco/IR/TFNodes.h b/compiler/moco/lang/include/moco/IR/TFNodes.h index cb1d3b1..80d2e0f 100644 --- a/compiler/moco/lang/include/moco/IR/TFNodes.h +++ b/compiler/moco/lang/include/moco/IR/TFNodes.h @@ -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" diff --git a/compiler/moco/lang/include/moco/IR/TFNodes.lst b/compiler/moco/lang/include/moco/IR/TFNodes.lst index 9132cd8..78f4db8 100644 --- a/compiler/moco/lang/include/moco/IR/TFNodes.lst +++ b/compiler/moco/lang/include/moco/IR/TFNodes.lst @@ -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 index 0000000..28a8133 --- /dev/null +++ b/compiler/moco/lang/src/IR/Nodes/TFConv2D.test.cpp @@ -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 + +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 index 0000000..f7ad4ce --- /dev/null +++ b/compiler/moco/lang/src/IR/Nodes/TFConv2DBackpropInput.test.cpp @@ -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 + +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 index 0000000..2562997 --- /dev/null +++ b/compiler/moco/lang/src/IR/Nodes/TFDepthwiseConv2dNative.test.cpp @@ -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 + +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); +}