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
相关产品推荐
相关产品推荐

