// // CoreMLScale.cpp // MNN // // Created by MNN on 2021/03/31. // Copyright © 2018, Alibaba Group Holding Limited // #include "CoreMLScale.hpp" namespace MNN { CoreMLScale::CoreMLScale(MNN::Backend *b, const MNN::Op *op, const std::vector &inputs, const std::vector &outputs) : CoreMLCommonExecution(b, op) { initLayer(); } ErrorCode CoreMLScale::onResize(const std::vector &inputs, const std::vector &outputs) { MNN_ASSERT(inputs.size() == 1 && outputs.size() == 1); auto scaleParam = mOp->main_as_Scale(); auto mnnScale = scaleParam->scaleData(); auto mnnBias = scaleParam->biasData(); auto channel = scaleParam->channels(); mLayer_->layer_case = CORE_ML__SPECIFICATION__NEURAL_NETWORK_LAYER__LAYER_SCALE; mLayer_->scale = mCoreMLBackend->create(); core_ml__specification__scale_layer_params__init(mLayer_->scale); mLayer_->scale->n_shapescale = 1; mLayer_->scale->shapescale = mCoreMLBackend->create(mLayer_->scale->n_shapescale); *mLayer_->scale->shapescale = channel; mLayer_->scale->scale = mCoreMLBackend->create(); core_ml__specification__weight_params__init(mLayer_->scale->scale); mLayer_->scale->scale->n_floatvalue = mnnScale->size(); mLayer_->scale->scale->floatvalue = mCoreMLBackend->create(mLayer_->scale->scale->n_floatvalue); memcpy(mLayer_->scale->scale->floatvalue, mnnScale->data(), mnnScale->size() * sizeof(float)); if (mnnBias->size() > 0) { mLayer_->scale->hasbias = true; mLayer_->scale->n_shapebias = 1; mLayer_->scale->shapebias = mCoreMLBackend->create(mLayer_->scale->n_shapebias); *mLayer_->scale->shapebias = channel; mLayer_->scale->bias = mCoreMLBackend->create(); core_ml__specification__weight_params__init(mLayer_->scale->bias); mLayer_->scale->bias->n_floatvalue = mnnBias->size(); mLayer_->scale->bias->floatvalue = mCoreMLBackend->create(mLayer_->scale->scale->n_floatvalue); memcpy(mLayer_->scale->bias->floatvalue, mnnBias->data(), mnnBias->size() * sizeof(float)); } setLayerInputsAndOutputs(mLayer_, {mCoreMLBackend->getTensorName(inputs[0])}, {mCoreMLBackend->getTensorName(outputs[0])}); mCoreMLBackend->addLayer(mLayer_); return NO_ERROR; } REGISTER_COREML_OP_CREATOR(CoreMLScale, OpType_Scale) } // namespace MNN