这是我的第一篇帖子,如果我的问题问得不够清楚,请随时纠正我。
代码片段相关的包:
我使用Keras函数式API训练我的模型。模型通过ModelCheckpoint保存:
ModelCheckpoint('path_save_model', save_best_only=True, monitor='recall', mode='max')
在新的脚本中,我简单地这样导入它:
model = tf.keras.models.load_model('path_save_model')
我为一次预测准备了数据。输入数据是一个3D的numpy数组。(由于我反复使用同一个数组,处理问题应该被排除在外。)每次,我得到不同的预测结果,这让我非常困惑。如果我运行以下代码:
np.testing.assert_allclose(model.predict(3d_np_array), model.predict(3d_np_array))
我得到:
Traceback (most recent call last):File “”, line 1, in File “C:\Users\me.virtualenvs\my_project\lib\site-packages\numpy\testing_private\utils.py”, line 1528, in assert_allcloseassert_array_compare(compare, actual, desired, err_msg=str(err_msg),File “C:\Users\me.virtualenvs\my_project\lib\site-packages\numpy\testing_private\utils.py”, line 842, in assert_array_compareraise AssertionError(msg)AssertionError:Not equal to tolerance rtol=1e-07, atol=0Mismatched elements: 17406 / 17500 (99.5%)Max absolute difference: 0.17088592Max relative difference: 3.6502254
这是一个非常简单的过程,我不知道我的错误可能在哪里。我认为一个训练并导入的模型的预测不应该包含任何随机性。然而,为了确保,我尝试设置所有种子并使用来自Keras文档的代码进行测试。
每次哈希值都相同,但预测结果仍然不同。
我有点希望我只是错过了什么明显的东西。
注意:
np.testing.assert_allclose(model.predict(np.zeros((1,2500,4))),model.predict(np.zeros((1,2500,4))))
导致类似的输出:
Mismatched elements: 17385 / 17500 (99.3%)
已解决
见答案
回答:
我从Keras文档中关于dropout层的描述中得到了错误的印象。实际上,我仍然对它感到困惑。我设置了training=True,因为这句话:
注意,Dropout层仅在training设置为True时应用,这样在推理时不会丢弃任何值。
见这里
我完全不再使用”training”参数,希望默认设置将是dropout层的正常使用(在训练时进行dropout,而在测试和预测时不进行dropout)。我希望这是正确的。如果我应该将training设置为False以获得期望的行为,请告诉我。