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格式:
然后在Python3中用以下方式加载:model.save('full_model.h5') # 保存完整模型,包含结构和权重
HDF5格式的跨版本兼容性比分开加载JSON和权重好很多。from keras.models import load_model model = load_model('full_model.h5')
4. 预处理逻辑的细微差异
- 检查Python2和Python3中生成
features的预处理逻辑是否完全一致。比如涉及文件读取、字符串解码时,Python2的str是字节类型,Python3的str是Unicode类型,如果预处理代码没适配,可能导致生成的features数值和训练时不同,最终模型输出NaN。 - 你可以在两边环境中输出
features的部分数值,对比是否完全一致,确认预处理流程没有差异。
内容的提问来源于stack exchange,提问作者Mitiku
相关产品推荐
相关产品推荐

