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 模型精度有所不同

用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan

如何使用加载的LSTM注意模型对输入进行预测?

将经过训练的 HDF5 模型加载到 Rust 中以进行预测

未知初始化器:加载 Keras 模型时的 GlorotUniform

Keras 在训练分类 LSTM 序列到序列模型时给出 nan