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

时间:2019-11-25 11:46:43

标签: python tensorflow keras

我正在使用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)

然后我按照here的说明保存整个模型:

model.save('some_model_name.h5')

在培训期间,我的准确率达到了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))

现在的准确度约为4%。请注意,我有批处理规范和辍学层。如何使模型的预测在不同会话之间保持一致?

2 个答案:

答案 0 :(得分:0)

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

第二,在达到一定程度的可重复性之前,我必须确保以下几点:

  1. 使用Adagrad优化程序而不是Adam可以给我带来与培训班相当的性能。每次加载会话时,(亚当)的预测都给我带来很大差异
  2. 从json加载体系结构和加载模型权重与仅保存和加载权重相比给了我不同的结果。前一种方法似乎产生了可比的性能(与培训相比)
  3. 使用tf.session进行训练并保存它,然后在新的python会话中重新加载tf.session可以达到目的。

无论是否有辍学或批处理规范,结果均无差异。

请注意,尽管这些步骤并非100%可重现,但遵循这些步骤可以使我保持一定程度的一致性。如果您遇到类似的问题,也许这些见解可能会有所帮助。

答案 1 :(得分:0)

在将模型加载到新的内核实例中之后,请确保以与保存前相同的方式再次使用.compile()配置损耗和度量。

例如:

old_model = tf.keras.Sequential([ ... ])
old_model.compile(loss = 'mean_squared_error', optimizer = 'sgd', metrics = ['accuracy'])
old_model.fit(train_ds, validation_data=valid_ds, epochs=3)
old_model.evaluate(test_ds)
old_model.save('some_model_name.h5')

然后在新内核中:

from tensorflow.keras.models import load_model
new_model = load_model("some_model_name.h5")
new_model.compile(loss = 'mean_squared_error', optimizer = 'sgd', metrics = ['accuracy'])
new_model.evaluate(test_ds) # should be the same now