我正在使用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%。请注意,我有批处理规范和辍学层。如何使模型的预测在不同会话之间保持一致?
答案 0 :(得分:0)
首先,由于2.0.0的稳定性问题,我已将TensorFlow版本降级为1.13.1。
第二,在达到一定程度的可重复性之前,我必须确保以下几点:
无论是否有辍学或批处理规范,结果均无差异。
请注意,尽管这些步骤并非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