1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <vpu/frontend/frontend.hpp>
12 #include <vpu/sw/post_op_stage.hpp>
18 class ScaleStage final : public PostOpStage {
20 StagePtr cloneImpl() const override {
21 return std::make_shared<ScaleStage>(*this);
24 void propagateScaleFactorsImpl(
25 const SmallVector<float>& inputScales,
26 ScalePropagationStep step) override {
27 IE_ASSERT(_inputEdges.size() == 2 || _inputEdges.size() == 3);
28 IE_ASSERT(_outputEdges.size() == 1);
30 auto inputScale = inputScales[0];
32 _scaleInfo.setInput(_inputEdges[1], step == ScalePropagationStep::Propagate ? 1.0f : inputScale);
33 if (_inputEdges.size() == 3) {
34 _scaleInfo.setInput(_inputEdges[2], inputScale);
36 _scaleInfo.setOutput(_outputEdges[0], inputScale);
39 void serializeParamsImpl(BlobSerializer&) const override {
45 Stage StageBuilder::addScaleStage(
46 const Model::Ptr& model,
47 const std::string& name,
48 const ie::CNNLayerPtr& layer,
52 return model->addNewStage<ScaleStage>(
60 void FrontEnd::parseScale(
61 const Model::Ptr& model,
62 const ie::CNNLayerPtr& _layer,
63 const DataVector& inputs,
64 const DataVector& outputs) {
65 IE_ASSERT(inputs.size() == 1);
66 IE_ASSERT(outputs.size() == 1);
68 auto layer = std::dynamic_pointer_cast<ie::ScaleShiftLayer>(_layer);
69 IE_ASSERT(layer != nullptr);
71 if (layer->_broadcast != 0) {
72 VPU_THROW_EXCEPTION <<
73 "Layer " << layer->name << " doesn't support broadcast param";
76 auto input = inputs[0];
77 auto output = outputs[0];
80 std::tie(scales, biases) = getWeightsAndBiases(model, layer);
82 if (biases->usage() == DataUsage::Fake) {
83 model->addNewStage<ScaleStage>(
90 model->addNewStage<ScaleStage>(
92 StageType::ScaleShift,
94 {input, scales, biases},