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
 |