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

CoreMLTools转换TensorFlow模型后在Swift中预测完全错误

Keras转Core ML后预测结果异常的排查方向

问题背景

离线训练的Keras模型(包含CNN、LSTM层,输出为单数值)在Python测试集上损失率较低,但通过CoreMLTools转换为Core ML模型并部署到iOS Swift环境后,预测结果近乎随机。

已尝试的无效方案

  • 以FP32精度导出模型
  • 设置Core ML为CPU-only计算模式
  • 确认Swift端输入数据与Python测试时完全一致,排除预处理差异

相关代码

Python导出模型代码

coreml_model = coremltools.converters.convert(
    model,
    source="tensorflow",
    inputs=[
        coremltools.TensorType(
            shape=(
                1,
                x_train.shape[1],
                x_train.shape[2],
            ),
            dtype=np.float32,
            name="my_data_input",
        )
    ],
    # 已测试开启/关闭这两行的情况
    compute_precision=coremltools.precision.FLOAT32,
    convert_to="mlprogram",
)

Python生成硬编码测试数据代码

oneDArr = []
for timestep in range(data.x_test.shape[1]):
    for sensor_num in range(data.x_test.shape[2]):
        oneDArr.append(str(data.x_test[my_chosen_index][timestep][sensor_num]))

print(",".join(oneDArr))

Swift调用模型代码

// 硬编码数据来自Python测试时的真实X_Test值
let myArrs: [[Double]] = [[-1.680063009262085, 0.7335805893, -4.93632972240448, -2.826584279537201, ..., -1.5832659602165222, 0.3495193272829056], ... [-4.035530686378479, 1.160736083984375, ...,  12.94029951095581]]
for subArray in myArrs {
    let mlArray = try! MLMultiArray(shape: [1 as NSNumber, TIEM_STEPS as NSNumber, SENSOR_DIMS as NSNumber], dataType: MLMultiArrayDataType.float32)
    
    for (idx, val) in subArray.enumerated() {
        mlArray[idx] = val as NSNumber
    }
    
    // 已测试开启/关闭CPU-only配置的情况
    let config = MLModelConfiguration()
    config.computeUnits = .cpuOnly
    let model = try! MyModel(configuration: config)
    let prediction: MyModelOutput = try! model.prediction(
        input: MyModelInput(my_data_input: mlArray)
    )
    let outputRaw = prediction.Identity[0].floatValue
    print("Found \(outputRaw)")
}

额外排查点建议

  • 检查输入维度顺序:TensorFlow后端的Keras默认数据格式为(batch, timesteps, features),但Core ML对LSTM层的维度解析可能存在差异。可尝试在转换时显式指定输入布局,或在Python中转置维度后再导出测试。
  • 验证转换后模型参数一致性:用CoreMLTools的coreml_model.inspect_layers()方法查看转换后模型的权重、偏置等参数,与原Keras模型对应层的参数抽样对比,确认转换过程中无参数失真。
  • 在Python端测试Core ML模型:直接用CoreMLTools加载转换后的.mlmodel或.mlpackage,输入相同测试数据,对比与原Keras模型的输出差异。若Python端Core ML输出异常,问题出在转换环节;若正常,则排查Swift端调用逻辑。
  • 排查LSTM层实现差异:TensorFlow与Core ML的LSTM在门控实现、序列处理方向等细节上可能存在差异。可将LSTM替换为SimpleRNN做最小化测试,定位问题是否源于LSTM层转换。
  • 检查MLMultiArray内存布局:MLMultiArray默认是行优先还是列优先?确认Swift端构造的MLMultiArray数据布局与原Keras模型一致。可构造极小测试输入(如2个时间步、2个特征),对比Python和Swift端的中间层输出,定位差异出现的环节。
  • 验证输出层逻辑:原Keras模型输出是否带有激活函数(如sigmoid、relu)?检查转换后的Core ML模型输出层配置,确认激活逻辑与原模型一致。
  • 尝试不同CoreMLTools版本:不同版本的CoreMLTools对TensorFlow模型的转换支持存在差异,可尝试降级或升级到5.x/6.x稳定版重新转换测试。
  • 禁用MLProgram格式测试:尝试转换为旧版.mlmodel格式(去掉convert_to参数),排除MLProgram格式的兼容性问题。

内容的提问来源于stack exchange,提问作者JJJohnson34

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:08:20