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

时间:2018-02-25 23:05:00

标签: python-3.x tensorflow model deep-learning keras

我训练了一个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)

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

4 个答案:

答案 0 :(得分:0)

我不确定Keras API已经使用了多长时间,但是我建议使用以下代码:

from keras.models import load_model

model2.save('model2.h5')
del model2
loaded_model2 = load_model('model2.h5')
score = loaded_model2.evaluate(X_test, y_test, verbose=0)
print(score)

您无需仅保存架构和权重就可以重新加载并进行预测。从Keras文档中:https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model

答案 1 :(得分:0)

不确定,您的问题是否已解决,但将来会遇到。 我在保存和加载权重时遇到了完全相同的问题。因此,在加载模型时,准确性和损失从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 :(得分:0)

在重新评估模型之前缩放数据集时,我的代码有效。我在保存模型之前进行了这种处理,但是当我打开模型并想再次对其进行评估时,忘记了重复此过程。完成该操作后,精度值应按\ 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()

答案 3 :(得分:0)

由于我的一个愚蠢错误,我遇到了同样的问题-加载数据生成器中的模型后,混洗选项(对训练有用)变成了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)