// // ScaleGrad.cpp // MNN // // Created by MNN on 2022/08/11. // Copyright © 2018, Alibaba Group Holding Limited // #include "OpGrad.hpp" #include "core/Macro.h" using namespace std; namespace MNN { using namespace MNN::Express; class ScaleGrad : public OpGrad { public: virtual std::vector onGrad(Express::EXPRP expr, const std::vector& backwardOutput) override { auto inputs = expr->inputs(); std::vector res(inputs.size(), nullptr); auto outputDiff = backwardOutput[0]; std::unique_ptr forwardOp(expr->get()->UnPack()); auto param = forwardOp->main.AsScale(); auto channels = param->channels; auto scale = param->scaleData; auto zeros = std::vector(scale.size(), 0.0f); res[0] = _Scale(outputDiff, channels, std::move(scale), std::move(zeros)); return res; } }; static void _create() { static ScaleGrad _c; OpGrad::insert(OpType_Scale, &_c); } REGISTER_GRAD(ScaleGrad_cpp, _create); };