[IE][VPU][GT]: Added support for SoftPlus & Swish layers (#1612)
authorAlexey Ershov <alexey.ershov@intel.com>
Wed, 5 Aug 2020 15:28:04 +0000 (18:28 +0300)
committerGitHub <noreply@github.com>
Wed, 5 Aug 2020 15:28:04 +0000 (18:28 +0300)
* Implement SoftPlus stage
* Implement Swish stage

inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp
inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp
inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp
inference-engine/src/vpu/graph_transformer/src/stages/softplus.cpp [new file with mode: 0644]
inference-engine/src/vpu/graph_transformer/src/stages/swish.cpp [new file with mode: 0644]

index 815ed2c..8eaf3f3 100644 (file)
@@ -156,6 +156,8 @@ public:
     void parseStaticShapeNMS(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
     void parseMish(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
     void parseGelu(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
+    void parseSoftPlus(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
+    void parseSwish(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const;
 
     //
     // Special layers
index 0952c9a..33ce129 100644 (file)
@@ -170,6 +170,8 @@ VPU_DECLARE_ENUM(StageType,
     Mish = 131,
     Gelu = 132,
     StridedSlice = 133,
+    SoftPlus = 134,
+    Swish = 135,
 )
 
 //
index 83d944e..55db1ff 100644 (file)
@@ -123,6 +123,8 @@ FrontEnd::FrontEnd(StageBuilder::Ptr stageBuilder, const ie::ICore* core)
         {"StaticShapeReshape",                                 LAYER_PARSER(parseReshape)},
         {"Mish",                                               LAYER_PARSER(parseMish)},
         {"Gelu",                                               LAYER_PARSER(parseGelu)},
+        {"SoftPlus",                                           LAYER_PARSER(parseSoftPlus)},
+        {"Swish",                                              LAYER_PARSER(parseSwish)},
     }} {
         VPU_THROW_UNLESS(_core != nullptr, "Argument core is null");
     }
diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/softplus.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/softplus.cpp
new file mode 100644 (file)
index 0000000..33f0779
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright (C) 2020 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+//
+
+#include <vpu/frontend/frontend.hpp>
+#include <vpu/stages/post_op_stage.hpp>
+
+namespace vpu {
+
+namespace {
+
+class SoftPlusStage final : public PostOpStage {
+public:
+    using PostOpStage::PostOpStage;
+
+private:
+    StagePtr cloneImpl() const override {
+        return std::make_shared<SoftPlusStage>(*this);
+    }
+
+    void serializeParamsImpl(BlobSerializer&) const override {
+    }
+};
+
+}  // namespace
+
+void FrontEnd::parseSoftPlus(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const {
+    VPU_THROW_UNLESS(inputs.size() == 1,
+                     "SoftPlus stage with name %s must have only 1 input, "
+                     "actually provided %d", layer->name, inputs.size());
+    VPU_THROW_UNLESS(outputs.size() == 1,
+                     "SoftPlus stage with name %s must have only 1 output, "
+                     "actually provided %d", layer->name, outputs.size());
+
+    model->addNewStage<SoftPlusStage>(layer->name, StageType::SoftPlus, layer, inputs, outputs);
+}
+
+}  // namespace vpu
diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/swish.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/swish.cpp
new file mode 100644 (file)
index 0000000..500d2cf
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright (C) 2020 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+//
+
+#include <vpu/frontend/frontend.hpp>
+#include <vpu/stages/post_op_stage.hpp>
+
+namespace vpu {
+
+namespace {
+
+class SwishStage final : public PostOpStage {
+public:
+    using PostOpStage::PostOpStage;
+
+private:
+    StagePtr cloneImpl() const override {
+        return std::make_shared<SwishStage>(*this);
+    }
+
+    void serializeParamsImpl(BlobSerializer&) const override {
+    }
+};
+
+}  // namespace
+
+void FrontEnd::parseSwish(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const {
+    VPU_THROW_UNLESS((inputs.size() == 1) || ((inputs.size() == 2)),
+                     "Swish stage with name %s must have 1 or 2 inputs, "
+                     "actually provided %d", layer->name, inputs.size());
+    VPU_THROW_UNLESS(outputs.size() == 1,
+                     "Swish stage with name %s must have only 1 output, "
+                     "actually provided %d", layer->name, outputs.size());
+
+    model->addNewStage<SwishStage>(layer->name, StageType::Swish, layer, inputs, outputs);
+}
+
+}  // namespace vpu