加载相同的保存模型后,Keras 模型精度有所不同

Posted

技术标签:

【中文标题】加载相同的保存模型后,Keras 模型精度有所不同【英文标题】:Keras Model Accuracy differs after loading the same saved model 【发布时间】:2018-08-05 08:58:00 【问题描述】:

我训练了一个 Keras 序列模型,然后加载了它。两种模型都给出了不同的精度。 我遇到了类似的问题,但无法解决问题。

示例代码: 加载和训练模型

model = gensim.models.FastText.load('abc.simple') 
X,y = load_data()
Vectors = np.array(vectors(X)) 
X_train, X_test, y_train, y_test = train_test_split(Vectors, np.array(y), 
test_size = 0.3, random_state = 0)
X_train = X_train.reshape(X_train.shape[0],100,max_tokens,1) 

X_test = X_test.reshape(X_test.shape[0],100,max_tokens,1)
data for input to our model
print(X_train.shape)
model2 = train()

score = model2.evaluate(X_test, y_test, verbose=0)
print(score)

训练准确率为 90%。 保存模型

# Saving Model
model_json = model2.to_json()
with open("model_architecture.json", "w") as json_file:
  json_file.write(model_json)
model2.save_weights("model_weights.h5")
print("Saved model to disk")

但是在我重新启动内核并加载保存的模型并在同一组数据上运行它之后,准确性降低了。

#load json and create model
json_file = open('model_architecture.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)

#load weights into new model
loaded_model.load_weights("model_weights.h5")
print("Loaded model from disk")

# evaluate loaded model on test data
loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', 
metrics=['accuracy'])

score = loaded_model.evaluate(X_test, y_test, verbose=0)
print(score) 

同一组数据的准确率降低到 75%。

如何使其保持一致?

我尝试了以下但没有帮助:

from keras.backend import manual_variable_initialization
manual_variable_initialization(True)

甚至,我一次保存了整个模型(权重和架构)但无法解决这个问题

【问题讨论】:

这似乎是 keras 中一个非常知名的 bug。查看github.com/keras-team/keras/issues/4875。我也有这个问题,目前还没有解决办法。 【参考方案1】:

不确定,如果您的问题已经解决,但对于未来的人。 我在保存和加载权重时遇到了完全相同的问题。因此,在加载模型时,准确率和损失从 68% 的准确率大幅更改为 2%。在我的实验中,我使用 Tensorflow 作为 Keras 模型层 Embedding、LSTM 和 Dense 的后端。我的问题通过修复使用 NumPy 随机生成器的 keras 的种子得到解决,因为我使用 Tensorflow 作为后端,所以我也修复了它的种子。 这些是我在文件顶部添加的行,其中还定义了模型。

from numpy.random import seed seed(42)# keras seed fixing import tensorflow as tf tf.random.set_seed(42)# tensorflow seed fixing

我希望这会有所帮助。 有关更多信息,请查看此-https://machinelearningmastery.com/reproducible-results-neural-networks-keras/

【讨论】:

种子似乎是最合乎逻辑的答案,但我试过这个没有用。您是否碰巧对此有其他解决方案?【参考方案2】:

由于我的一个愚蠢的错误,我遇到了同样的问题 - 在加载模型后,我的数据生成器中的随机播放选项(对训练有用)变成了 True 而不是 False。将其更改为False 后,模型按预期进行了预测。如果 keras 可以自动处理这个问题,那就太好了。这是我的关键代码部分:

pred_generator = pred_datagen.flow_from_directory(
    directory='./ims_dir',
    target_size=(100, 100),
    color_mode="rgb",
    batch_size=1,
    class_mode="categorical",
    shuffle=False,
)

model = load_model(logpath_ms)

pred=model.predict_generator(pred_generator, steps = N, verbose=1)

【讨论】:

【参考方案3】:

在重新评估模型之前缩放数据集时,我的代码工作正常。我在保存模型之前做了这个处理,当我打开模型并想再次评估它时忘记重复这个过程。在我这样做之后,准确度值出现了它应该 \o/

model_saved = keras.models.load_model('tuned_cnn_1D_HAR_example.h5')

trainX, trainy, testX, testy = load_dataset()
trainX, testX = scale_data(trainX, testX, True) 
score = model_saved.evaluate(testX, testy, verbose=0)
print("%s: %.2f%%" % (model_saved.metrics_names[1], score[1]*100))

在我的函数 scale_data 中,我使用了 StandardScaler()

【讨论】:

以上是关于加载相同的保存模型后,Keras 模型精度有所不同的主要内容,如果未能解决你的问题,请参考以下文章

Keras 模型在保存/加载后预测 NaN

在 Keras 的 MNIST 数字识别中获得不同的测试数据精度

从不同版本的 tf.keras 加载保存的模型(从 tf 2.3.0 到 tf 1.12)

相同 Keras 模型和数据的准确度低于 AUC [关闭]

无法加载和使用多个 keras 模型

如何减小 keras 保存模型的大小?