2017-05-30 311 views
0

我已经训练了一个模型并保存在一个特定的目录中,同时训练它提供了大约81%的测试精度。我用下面的命令:经过训练和加载的Keras Sequential模型给出了不同的结果

model = Sequential() 
model.add(Embedding(max_features, 128, input_length=max_len)) 
model.add(SpatialDropout1D(0.3)) 
model.add(GaussianNoise(0.2)) 
model.add(LSTM(128 , dropout_W=0.3, dropout_U=0.3, return_sequences=False)) 
model.add(LSTM(56, dropout_W = 0.4, dropout_U=0.4)) 
model.add(Dense(1, W_regularizer=l2(0.2))) 
model.add(Activation('sigmoid')) 
model.summary() 
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.00) 
model.compile(loss='binary_crossentropy', optimizer=adam,metrics = ['accuracy']) 
model_history = model.fit(x, y=y, batch_size=128, epochs=2, verbose=1,validation_split = 0.2) 

model_json = model.to_json() 
with open("C:/Users/twelve_user/Downloads/model3.json", "w") as json_file: 
     json_file.write(model_json) 
model.save_weights("C:/Users/twelve_user/Downloads/weights_model3.h5") 
print("Saved model to disk") 
predictions = model.predict(testx) 

但每当我试图加载不同的python脚本同一型号,精度倒下即76%。有时候我会得到像未经训练的模型那样的随机准确性。命令在下面给出我已经用于加载:

json_file = open('C:/Users/twelve_user/Downloads/model3.json', 'r') 
loaded_model_json = json_file.read() 
json_file.close() 
model = model_from_json(loaded_model_json) 
model.load_weights("C:/Users/twelve_user/Downloads/weights_mode3.h5") 
print("Loaded model from disk") 

这怎么可能?训练和加载模型的结果应该是相同的。由于我对凯拉斯很陌生,无法理解我错在哪里。
谢谢你的帮助!任何帮助,将不胜感激。

回答

-1

这很可能是因为您只保存模型结构和模型权重。您不保存优化程序或培训配置的状态。如果您想要完全相同的型号,请使用keras功能model.save

另请参阅this常见问题了解更多信息。

实施例代码

predictions_before = model.predict(testx) 
model.save('model3.h5') 
del model 

model = load_model('model3.h5') 
predictions_after = model.predict(testx) 
+0

感谢您的提示的响应。我有两个脚本文件。第一个脚本包含:定义模型,图层,编译,训练,预测,然后保存模型(model.save和model.save_weights)。 第二个脚本包含:定义model.layers,编译,model.save,del模型,load_model,预测。我仍然从两个脚本文件中获得不同的结果。 – user

+0

使用model.save的模型完全一样。当你第二次预测时你是否使用了相同的数据? –

+0

是的,两个文件中的数据都是相同的。第一个文件是用于训练和测试,以了解测试的准确性。为了节省时间,创建第二个文件只用相同的数据进行测试。所以我认为这两个文件的准确性应该是相同的。因为数据集,模型定义,图层,都是一样的。 – user

相关问题