mirror of https://github.com/alibaba/MNN.git
52 lines
2.5 KiB
C++
52 lines
2.5 KiB
C++
//
|
|
// 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<Tensor *> &inputs, const std::vector<MNN::Tensor *> &outputs) : CoreMLCommonExecution(b, op) {
|
|
initLayer();
|
|
}
|
|
|
|
ErrorCode CoreMLScale::onResize(const std::vector<Tensor *> &inputs, const std::vector<Tensor *> &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<CoreML__Specification__ScaleLayerParams>();
|
|
core_ml__specification__scale_layer_params__init(mLayer_->scale);
|
|
mLayer_->scale->n_shapescale = 1;
|
|
mLayer_->scale->shapescale = mCoreMLBackend->create<uint64_t>(mLayer_->scale->n_shapescale);
|
|
*mLayer_->scale->shapescale = channel;
|
|
mLayer_->scale->scale = mCoreMLBackend->create<CoreML__Specification__WeightParams>();
|
|
core_ml__specification__weight_params__init(mLayer_->scale->scale);
|
|
mLayer_->scale->scale->n_floatvalue = mnnScale->size();
|
|
mLayer_->scale->scale->floatvalue = mCoreMLBackend->create<float>(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<uint64_t>(mLayer_->scale->n_shapebias);
|
|
*mLayer_->scale->shapebias = channel;
|
|
mLayer_->scale->bias = mCoreMLBackend->create<CoreML__Specification__WeightParams>();
|
|
core_ml__specification__weight_params__init(mLayer_->scale->bias);
|
|
mLayer_->scale->bias->n_floatvalue = mnnBias->size();
|
|
mLayer_->scale->bias->floatvalue = mCoreMLBackend->create<float>(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
|