MLMultiArray未声明类型错误及Core ML模型输入配置咨询
解决Core ML模型接收一维Double数组输入的方案
针对你用sklearn SVR转换的Core ML模型,在Xcode 9.2里要改成接收一维Double数组输入的需求,我给你分步骤梳理可行方案:
1. 重新转换模型时直接指定输入类型(推荐)
如果还能重新从sklearn导出模型,用coremltools转换时可以直接定义输入为一维Double数组,避免后期修改模型:
import coremltools from sklearn.svm import SVR # 假设你已经训练好SVR模型svr_model coreml_model = coremltools.converters.sklearn.convert( svr_model, input_features=["input_features"], # 自定义输入特征名 output_feature_names=["prediction"] ) # 关键:设置输入为一维Double数组 coreml_model.input_description["input_features"] = "One-dimensional array of Double values" coreml_model.type["input_features"] = coremltools.ArrayType(shape=(1,)) # 定义一维数组形状 # 保存修改后的模型 coreml_model.save("SVRModel.mlmodel")
2. 在Xcode中直接修改现有模型的输入类型
如果已经有现成的.mlmodel文件,不想重新转换,可以直接在Xcode里调整:
- 将
.mlmodel拖入Xcode项目,双击打开模型编辑器 - 在Inputs区域找到当前输入(默认是
MLMultiArray类型) - 点击类型下拉框,选择
Array (Double),然后设置数组的Dimensions为1(对应一维结构) - 保存模型,Xcode会自动重新生成适配的Swift/Objective-C接口
3. 代码中处理输入(以Swift为例)
修改完模型后,代码里就能直接传入一维Double数组,无需再转MLMultiArray,自然也不会出现“未声明类型”的错误:
import CoreML // 加载模型 guard let model = try? SVRModel(configuration: MLModelConfiguration()) else { fatalError("Failed to load SVR model") } // 准备你的一维Double数组输入 let inputData: [Double] = [2.5, 4.8, 7.1] // 替换为实际业务数据 // 创建模型输入实例 guard let modelInput = try? SVRModelInput(input_features: inputData) else { fatalError("Failed to create model input") } // 执行预测 do { let predictionResult = try model.prediction(input: modelInput) print("Predicted value: \(predictionResult.prediction)") } catch { print("Prediction error: \(error.localizedDescription)") }
4. 小提示:排查“未声明类型”错误
如果之前的错误是MLMultiArray相关类型未识别,大概率是这两个原因:
- 代码里没导入
CoreML框架,记得加import CoreML - Xcode未正确生成模型接口,修改模型后执行
Cmd+Shift+K清理项目,再Cmd+B重新构建
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

