From dc89cb1627d6e511e75d2363e96ebdfdba3cb6cf Mon Sep 17 00:00:00 2001 From: Alexey Ershov Date: Wed, 5 Aug 2020 18:28:04 +0300 Subject: [PATCH] [IE][VPU][GT]: Added support for SoftPlus & Swish layers (#1612) * Implement SoftPlus stage * Implement Swish stage --- .../include/vpu/frontend/frontend.hpp | 2 + .../include/vpu/model/stage.hpp | 2 + .../src/frontend/frontend.cpp | 2 + .../graph_transformer/src/stages/softplus.cpp | 38 +++++++++++++++++++ .../graph_transformer/src/stages/swish.cpp | 38 +++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 inference-engine/src/vpu/graph_transformer/src/stages/softplus.cpp create mode 100644 inference-engine/src/vpu/graph_transformer/src/stages/swish.cpp diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp index 815ed2c3430..8eaf3f30551 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp @@ -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 diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp index 0952c9a73e9..33ce129be47 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp @@ -170,6 +170,8 @@ VPU_DECLARE_ENUM(StageType, Mish = 131, Gelu = 132, StridedSlice = 133, + SoftPlus = 134, + Swish = 135, ) // diff --git a/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp b/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp index 83d944e3f64..55db1ffb8d7 100644 --- a/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp @@ -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 index 00000000000..33f077999c7 --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/src/stages/softplus.cpp @@ -0,0 +1,38 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include + +namespace vpu { + +namespace { + +class SoftPlusStage final : public PostOpStage { +public: + using PostOpStage::PostOpStage; + +private: + StagePtr cloneImpl() const override { + return std::make_shared(*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(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 index 00000000000..500d2cffe71 --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/src/stages/swish.cpp @@ -0,0 +1,38 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include + +namespace vpu { + +namespace { + +class SwishStage final : public PostOpStage { +public: + using PostOpStage::PostOpStage; + +private: + StagePtr cloneImpl() const override { + return std::make_shared(*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(layer->name, StageType::Swish, layer, inputs, outputs); +} + +} // namespace vpu