Keras 模型在保存/加载后预测 NaN
Posted
技术标签:
【中文标题】Keras 模型在保存/加载后预测 NaN【英文标题】:Keras model predict NaNs after save/load 【发布时间】:2021-12-25 00:35:17 【问题描述】:Keras 模型在编译/训练后运行良好:
>>> model.predict(values)
array([[5.28525668e-10, 3.66615766e-12, 2.76005746e-10, ...,
1.06744905e-10, 3.96939370e-09, 1.54998125e-09],
[1.08512407e-17, 1.16371355e-20, 3.40085518e-20, ...,
1.58855026e-15, 3.41645340e-23, 2.22618953e-18],
[8.91928664e-07, 1.51766372e-07, 5.11579383e-05, ...,
2.09874074e-07, 1.08243627e-08, 1.00344047e-03],
...,
[1.48135211e-06, 4.81735299e-07, 7.23933127e-08, ...,
6.75531879e-08, 2.97403737e-08, 5.35680655e-08],
[2.52744006e-12, 1.91630305e-11, 4.30207465e-13, ...,
6.73083234e-09, 1.56778467e-13, 6.92025376e-13],
[2.72180110e-08, 2.60345967e-08, 6.72346505e-05, ...,
1.04813864e-06, 8.22153803e-11, 6.33114814e-06]], dtype=float32)
但是在保存模型并在不同的脚本中加载它之后:
# script 1
model.save('./model')
# script 2:
model = tf.keras.models.load_model(f"./model")
在加载的模型上调用 model.predict()
只返回 NaN 值,在完全相同的输入数据上:
>>> model.predict(values)
array([[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]], dtype=float32)
这直到最近都运行良好,但现在突然模型开始表现得像这样。同样,在完全相同的数据上返回脚本 1 工作得非常好,重新启动脚本(1 和 2)并再次保存模型然后再次重新加载并没有任何改进。
我检查了保存的模型和加载的模型完全一样 我也尝试拨打loaded_model(values, training=False)
,但没有成功
知道这里发生了什么以及如何解决这个问题吗?使用 TensorFlow 2.3.4。
【问题讨论】:
请分享一个可重现的数据集(至少与 mnist 一起)。还有,要试试用.h5格式保存,是一样的吗? 可重现的数据集在这里没有意义,因为它不会发生在您的配置中。这个问题是关于了解可能导致问题的原因,而不是试图重现示例。 【参考方案1】:原来这是因为训练数据集中的某些值位于nan
。
结果,一些层的权重也是nan
。
令人惊讶的一点是,在 GPU 上运行 model.predict()
非常好,而在 CPU 上则导致所有 nan
预测。
我直接在 GPU 上使用拟合模型,在 CPU 上使用保存的模型,因此我相信它与模型保存有关,但根本没有。纯粹是 GPU 与 CPU 的二分法。
我最终从训练数据集中清理了 nan
值,现在该模型免除了 nan
权重,并且在 CPU 和 GPU 上运行良好。
【讨论】:
以上是关于Keras 模型在保存/加载后预测 NaN的主要内容,如果未能解决你的问题,请参考以下文章
用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan