You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CoreML输入验证失败:形状不在允许集合的技术求助

嗨,这个问题其实是典型的CoreML输入形状不匹配导致的!你最初训练模型时,词袋是17个元素,所以生成的mlmodel输入层被固定成了17维;现在词袋扩容到36个元素,你还是在用旧的模型,自然会触发"形状不在允许集合里"的错误。

接下来给你一步步解决的方案:

1. 重新训练Keras模型,更新输入层维度

先回到你的训练代码,把模型输入层的形状改成36(和新的词袋尺寸一致)。比如之前如果是这么写的:

model.add(Dense(16, input_shape=(17,), activation='relu'))

现在要改成:

model.add(Dense(16, input_shape=(36,), activation='relu'))

然后用新的词袋对应的训练数据重新跑一遍训练,确保模型的输入逻辑完全适配36维的词袋。

2. 重新转换模型为mlmodel格式

训练完成后,重新把Keras模型转成TensorFlow格式,再导出为CoreML的mlmodel文件。转换时一定要确认输入形状被设置为36,比如用CoreML Tools的话可以显式指定:

import coremltools as ct

# 假设你的TensorFlow模型是tf_model
coreml_model = ct.convert(
    tf_model,
    inputs=[ct.TensorType(shape=(1, 36))]  # 这里的36对应新的词袋尺寸
)
coreml_model.save("IntentClassifier.mlmodel")

这样生成的新mlmodel就会接受36维的输入了。

3. 在Xcode里验证模型输入形状

把新的mlmodel导入Xcode后,点击模型文件,在右侧的检查面板里查看input1的形状是不是(36)。如果还是显示17,说明转换过程出了问题,得回去检查转换代码或者训练时的输入层设置。

4. 修正iOS代码里的MLMultiArray初始化

最后,在你的iOS代码里,初始化MLMultiArray时要明确用36的维度:

guard let mlMultiArray = try? MLMultiArray(shape: [36], dataType: .double) else {
    fatalError("Failed to create MLMultiArray")
}
// 接着把你的词袋数据填充到这个mlMultiArray里

别再用之前的[17]了,必须和模型的输入形状完全匹配。

按照这几步操作后,再调用model.prediction(input1: mlMultiArray)应该就能正常运行了!

内容的提问来源于stack exchange,提问作者akashlal.com

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:03:15