Keras 模型在 save/load 之后预测 NaN
Keras model predict NaNs after save/load
Keras 模型在 compiling/training:
之后运行良好
>>> 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()
returns 仅 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.
原来这是因为训练数据集中的某些值 nan
。
因此,部分层的权重也是nan
。
令人惊讶的一点是 运行 model.predict()
在 GPU 上非常好,而在 CPU 上它导致了所有 nan
个预测。
我直接在 GPU 上使用拟合模型,在 CPU 上使用保存的模型,因此我认为它与模型保存有关,但根本没有。纯 GPU 与 CPU 二分法。
我最终清理了训练数据集中的 nan
值,现在该模型不受 nan
权重影响,并且在 CPU 和 GPU 上运行良好。
Keras 模型在 compiling/training:
之后运行良好>>> 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()
returns 仅 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.
原来这是因为训练数据集中的某些值 nan
。
因此,部分层的权重也是nan
。
令人惊讶的一点是 运行 model.predict()
在 GPU 上非常好,而在 CPU 上它导致了所有 nan
个预测。
我直接在 GPU 上使用拟合模型,在 CPU 上使用保存的模型,因此我认为它与模型保存有关,但根本没有。纯 GPU 与 CPU 二分法。
我最终清理了训练数据集中的 nan
值,现在该模型不受 nan
权重影响,并且在 CPU 和 GPU 上运行良好。