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

Python 2训练的Keras模型在Python 3中预测输出NaN值问题排查

跨Python版本Keras模型预测输出NaN的原因排查

这问题我之前也碰到过类似的,跨Python2和3迁移Keras模型后出现NaN预测结果,大概率是下面几个原因导致的,你可以逐一排查:

1. 输入数据或数据类型不兼容

  • 首先要确认你的features在Python3环境下是不是本身就包含NaN,或者数据类型和训练时不一致。比如训练时模型接收的是numpy.float32类型的输入,但Python3中生成的features是float64,这种类型不匹配可能导致模型计算时出现数值溢出或NaN。
  • 你可以在Python3中加两行代码检查:
    print(features.dtype)  # 查看输入数据类型,和Python2环境下对比
    print(np.isnan(features).any())  # 检查输入是否包含NaN
    

2. Keras/TensorFlow版本差异过大

  • Python2环境下的Keras通常搭配的是TensorFlow 1.x系列,而Python3如果用的是TensorFlow 2.x或高版本Keras,新旧版本的层实现、序列化格式可能存在兼容性问题。比如旧版本Keras的某些层在新版本中解析异常,导致权重加载后变成NaN。
  • 建议你查看Python2环境下的Keras和TensorFlow版本(用pip list查看),然后在Python3环境中安装相同或相近的版本(注意TensorFlow 1.x最高支持Python3.6,所以如果Python3版本太高可能需要调整)。

3. Pickle序列化的跨版本兼容性问题

  • Keras加载权重文件时底层依赖pickle模块,但Python2的pickle格式和Python3不完全兼容。尤其是分开加载模型结构(JSON)和权重的方式,更容易出现权重解码错误,导致权重值变成NaN。
  • 推荐你在Python2环境中把整个模型保存为HDF5格式:
    model.save('full_model.h5')  # 保存完整模型,包含结构和权重
    
    然后在Python3中用以下方式加载:
    from keras.models import load_model
    model = load_model('full_model.h5')
    
    HDF5格式的跨版本兼容性比分开加载JSON和权重好很多。

4. 预处理逻辑的细微差异

  • 检查Python2和Python3中生成features的预处理逻辑是否完全一致。比如涉及文件读取、字符串解码时,Python2的str是字节类型,Python3的str是Unicode类型,如果预处理代码没适配,可能导致生成的features数值和训练时不同,最终模型输出NaN。
  • 你可以在两边环境中输出features的部分数值,对比是否完全一致,确认预处理流程没有差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:09:15