1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <vpu/frontend/frontend.hpp>
11 #include <vpu/sw/post_op_stage.hpp>
15 void FrontEnd::parseBias(
16 const Model::Ptr& model,
17 const ie::CNNLayerPtr& layer,
18 const DataVector& inputs,
19 const DataVector& outputs) {
20 IE_ASSERT(inputs.size() == 2);
21 IE_ASSERT(outputs.size() == 1);
23 auto input = inputs[0];
24 auto biases = inputs[1];
26 auto biasesDims = biases->desc().dims();
27 if (biasesDims.size() < 4 && input->desc().numDims() == 4) {
28 biasesDims.set(Dim::N, 1);
31 if (input->desc().dims() != biasesDims) {
33 << "Current Bias layer implementation supports only equal inputs (axis 0, 1 for 4D tensor, axis 0 for other dimensions),"
34 << " layer name is " << layer->name;
37 if (biases->desc().numDims() < 4 && input->desc().numDims() == 4) {
38 DataDesc newBiasesDesc({
39 biases->desc().dim(Dim::W),
40 biases->desc().dim(Dim::H),
41 biases->desc().dim(Dim::C),
44 auto newBiases = model->duplicateData(
49 _stageBuilder->addReshapeStage(
59 _stageBuilder->addSumStage(
69 class BiasStage final : public PostOpStage {
71 StagePtr cloneImpl() const override {
72 return std::make_shared<BiasStage>(*this);
75 DataMap<float> propagateScaleFactorsImpl(
76 const DataMap<float>& inputScales,
77 ScalePropagationStep step) override {
78 IE_ASSERT(_inputEdges.size() == 2);
79 IE_ASSERT(_outputEdges.size() == 1);
81 auto input = _inputEdges[0]->input();
82 auto biases = _inputEdges[1]->input();
83 auto output = _outputEdges[0]->output();
87 if (step == ScalePropagationStep::Propagate) {
88 auto inputScale = inputScales.at(input);
90 out[biases] = inputScale;
91 out[output] = inputScale;
93 // Bias can only propagate scaling, not generate.
102 void serializeParamsImpl(BlobSerializer&) const override {
108 Stage StageBuilder::addBiasStage(
109 const Model::Ptr& model,
110 const std::string& name,
111 const ie::CNNLayerPtr& layer,
114 const Data& output) {
115 return model->addNewStage<BiasStage>(