// // ConcatGrad.cpp // MNN // // Created by MNN on 2019/12/11. // Copyright © 2018, Alibaba Group Holding Limited // #include "OpGrad.hpp" #include "core/Macro.h" using namespace std; using namespace MNN::Express; namespace MNN { class ConcatGrad : public OpGrad { public: virtual std::vector onGrad(Express::EXPRP expr, const std::vector& backwardOutput) override { std::vector res(expr->inputs().size()); if (!expr->requireInfo()) { return res; } auto axis = expr->get()->main_as_Axis()->axis(); if (axis < 0) { axis = expr->outputInfo(0)->dim.size() + axis; } std::vector points(res.size()); for (int i = 0; i < res.size(); ++i) { auto input = expr->inputs()[i]; points[i] = input->getInfo()->dim[axis]; } res = _Split(backwardOutput[0], points, axis); return res; } }; static void _create() { static ConcatGrad _c; OpGrad::insert((int)OpType_Concat, &_c); }; REGISTER_GRAD(ConcatGrad, _create); }