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,
27 StageDataInfo<float>& scaleInfo) override {
28 auto inputScale = inputScales[0];
30 scaleInfo.setInput(inputEdge(1), step == ScalePropagationStep::Propagate ? 1.0f : inputScale);
31 if (numInputs() == 3) {
32 scaleInfo.setInput(inputEdge(2), inputScale);
34 scaleInfo.setOutput(outputEdge(0), inputScale);
37 void serializeParamsImpl(BlobSerializer&) const override {
43 Stage StageBuilder::addScaleStage(
44 const Model::Ptr& model,
45 const std::string& name,
46 const ie::CNNLayerPtr& layer,
50 return model->addNewStage<ScaleStage>(
58 void FrontEnd::parseScale(
59 const Model::Ptr& model,
60 const ie::CNNLayerPtr& _layer,
61 const DataVector& inputs,
62 const DataVector& outputs) {
63 IE_ASSERT(inputs.size() == 1);
64 IE_ASSERT(outputs.size() == 1);
66 auto layer = std::dynamic_pointer_cast<ie::ScaleShiftLayer>(_layer);
67 IE_ASSERT(layer != nullptr);
69 if (layer->_broadcast != 0) {
70 VPU_THROW_EXCEPTION <<
71 "Layer " << layer->name << " doesn't support broadcast param";
74 auto input = inputs[0];
75 auto output = outputs[0];
78 std::tie(scales, biases) = getWeightsAndBiases(model, layer);
80 if (biases->usage() == DataUsage::Fake) {
81 model->addNewStage<ScaleStage>(
88 model->addNewStage<ScaleStage>(
90 StageType::ScaleShift,
92 {input, scales, biases},