保存后 Keras 加载模型在新的 python 会话中进行随机预测

cyb*_*oth 5 python keras tensorflow

我正在使用tensorflow版本“2.0.0”和keras版本“2.3.0”来开发模型。这是我保存模型的方法:

seed = 1234
random.seed(seed)
np.random.seed(seed)
tf.compat.v1.random.set_random_seed(seed)
Run Code Online (Sandbox Code Playgroud)

然后,我按照此处的说明保存整个模型:

model.save('some_model_name.h5')
Run Code Online (Sandbox Code Playgroud)

我在训练期间获得了大约 95% 的准确率。当我从不同的 python 会话加载模型时,例如:

# Recreate the exact same model
new_model = load_model('some_model_name.h5', custom_objects={'SeqSelfAttention': SeqSelfAttention})
score = new_model.evaluate([x_img_train, x_txt_train], y_train, verbose=2)
print("%s: %.2f%%" % (new_model.metrics_names[1], score[1]*100))
Run Code Online (Sandbox Code Playgroud)

现在的准确率约为4%。请注意,我有批量归一化层和丢失层。如何使模型的预测在不同会话中保持一致?

cyb*_*oth 1

首先,由于2.0.0的稳定性问题,我将TensorFlow版本降级到1.13.1。

其次,在达到一定程度的可重复性之前,我必须确保一些事情:

  1. 使用 Adagrad 优化器代替 Adam 为我提供了与训练会话相当的性能。每次我加载会话时,它都会给我带来很大的预测差异(对于 Adam)
  2. 与仅保存和加载权重相比,从 json 加载架构并加载模型权重随后给了我不同的结果。前一种方法似乎产生了可比的性能(与训练相比)
  3. 使用 tf.session 来训练并保存它,然后在新的 python 会话中重新加载 tf.session 就可以了。

无论有没有 dropout 或 Batchnorm,结果都没有变化。

请注意,遵循这些步骤给了我一定程度的一致性,尽管它不是 100% 可重复的。如果您面临类似的问题,也许这些见解会有所帮助。