From b09a64ac4086dba7c3120f8d02e6723a479135aa Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=82=A8=EA=B6=81=EC=84=9D/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Engineer/=EC=82=BC=EC=84=B1=EC=A0=84?= =?utf8?q?=EC=9E=90?= Date: Fri, 9 Nov 2018 16:35:08 +0900 Subject: [PATCH] [coco] Support ReLU6 for tflite in coco (#2191) * [coco] Support ReLU6 for tflite in coco This commit will enable ReLU6 operation for tflite in coco Signed-off-by: Seok NamKoong * Add comment * modify comment --- contrib/coco/core/include/coco/IR/Op.lst | 1 + contrib/coco/core/include/coco/IR/Ops.h | 18 ++++++ contrib/coco/core/src/IR/OpManager.test.cpp | 7 +++ contrib/coco/core/src/IR/ReLU6.test.cpp | 85 +++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 contrib/coco/core/src/IR/ReLU6.test.cpp diff --git a/contrib/coco/core/include/coco/IR/Op.lst b/contrib/coco/core/include/coco/IR/Op.lst index 96467be..78db035 100644 --- a/contrib/coco/core/include/coco/IR/Op.lst +++ b/contrib/coco/core/include/coco/IR/Op.lst @@ -10,6 +10,7 @@ OP(MaxPool2D) OP(AvgPool2D) OP(PadF) OP(ReLU) +OP(ReLU6) OP(Add) OP(Mul) OP(ConcatF) diff --git a/contrib/coco/core/include/coco/IR/Ops.h b/contrib/coco/core/include/coco/IR/Ops.h index 6534d27..c197a17 100644 --- a/contrib/coco/core/include/coco/IR/Ops.h +++ b/contrib/coco/core/include/coco/IR/Ops.h @@ -255,6 +255,24 @@ public: }; /** + * @brief Apply ReLU6 over elements + * @note ReLU6 is subject to change + */ +class ReLU6 final : public UnaryOp +{ +public: + explicit ReLU6() = default; + +public: + ReLU6(const ReLU6 &) = delete; + ReLU6(ReLU6 &&) = delete; + +public: + ReLU6 *asReLU6(void) override { return this; } + const ReLU6 *asReLU6(void) const override { return this; } +}; + +/** * @brief Element-wise addition * * Add(L, R) is valid only when L and R have identical kind/shape/dtype diff --git a/contrib/coco/core/src/IR/OpManager.test.cpp b/contrib/coco/core/src/IR/OpManager.test.cpp index ec9816d..daaea4c 100644 --- a/contrib/coco/core/src/IR/OpManager.test.cpp +++ b/contrib/coco/core/src/IR/OpManager.test.cpp @@ -54,6 +54,13 @@ TEST_F(OpManagerTest, ReLU) ASSERT_NE(obj, nullptr); } +TEST_F(OpManagerTest, ReLU6) +{ + auto obj = mgr.create(); + + ASSERT_NE(obj, nullptr); +} + TEST_F(OpManagerTest, PadF) { auto op = mgr.create(); diff --git a/contrib/coco/core/src/IR/ReLU6.test.cpp b/contrib/coco/core/src/IR/ReLU6.test.cpp new file mode 100644 index 0000000..938bb04 --- /dev/null +++ b/contrib/coco/core/src/IR/ReLU6.test.cpp @@ -0,0 +1,85 @@ +/* + * 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. + */ + +#include "coco/IR/Ops.h" + +#include +#include + +#include + +namespace +{ +struct IsReLU6 : public coco::Op::DefaultVisitor +{ + bool visit(const coco::ReLU6 *) override { return true; } +}; + +class ReLU6Test : public ::testing::Test +{ +public: + ReLU6Test() + { + // DO NOTHING + } + +protected: + coco::ReLU6 *allocate(void) + { + auto op = new coco::ReLU6; + _allocated.emplace_back(op); + return op; + } + +private: + std::vector> _allocated; +}; +} // namespace + +TEST_F(ReLU6Test, initialization) +{ + auto op = allocate(); + + // uses() should be empty on construction + ASSERT_EQ(op->uses().size(), 0); + // parent() should be nullptr on construction + ASSERT_EQ(op->parent(), nullptr); + + ASSERT_EQ(op->arg(), nullptr); +} + +TEST_F(ReLU6Test, asReLU6) +{ + auto op = allocate(); + + coco::Op *mutable_base = op; + const coco::Op *immutable_base = op; + + ASSERT_EQ(mutable_base->asReLU6(), op); + ASSERT_EQ(mutable_base->asReLU6(), immutable_base->asReLU6()); +} + +TEST_F(ReLU6Test, accept) +{ + // Test 'ReLU6' class + auto op = allocate(); + + coco::ReLU6 *mutable_ptr = op; + const coco::ReLU6 *immutable_ptr = op; + + ASSERT_TRUE(mutable_ptr->accept(IsReLU6{})); + ASSERT_TRUE(immutable_ptr->accept(IsReLU6{})); +} -- 2.7.4