顺序模型在每次运行中给出不同的结果

问题描述:

我有一个用于构建keras顺序模型的python脚本。每次我都会得到不同的结果,而且脚本中没有任何更改。请看看脚本。我错了,请帮忙。顺序模型在每次运行中给出不同的结果

thedata = pandas.read_csv("C:/User/Downloads/LSTM/data.csv", sep=', ', delimiter=',', header='infer', names=None) 

np.random.seed(1337) 

x = thedata['Review'] 
y = thedata['Polarity_Numeral'] 
x = x.iloc[:].values 
y = y.iloc[:].values 

tk = Tokenizer(num_words=40000, lower=True, split=" ") 
tk.fit_on_texts(x) 
x = tk.texts_to_sequences(x)  
max_len = 120 
x = pad_sequences(x, maxlen=max_len) 
max_features = 40000 
testx = x[51000:52588] 
print (testx) 
testy = y[51000:52588] 
x = x[0:50999] 
y = y[0:50999] 


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(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=64, epochs=1, verbose=1,validation_split = 0.2) 
model.save('C:/User/Downloads/model.h5') 
model.save_weights('C:/User/Downloads/weight_model.h5') 

predictions = model.predict(testx) 
print (predictions) 

在第一次运行,我得到即57% 在第二次运行.. 53% 在第三.. 55% 每次它是随机改变。 感谢您的帮助!

+0

您是否使用tensorflow后端?比它可能与此[问题](https://github.com/fchollet/keras/issues/2280)有关。 – sietschie

+0

关于'tk.fit_on_texts(x)',是否有某种训练?如果是这样,你还应该保存你的x和y,并确保它们对于新的和加载的模型都完全相同。 –

+0

是的,用于文本预处理。我无法准确理解发生了什么。同样的数据集在训练和测试方面,同样的模型我正在加载,仍然给它不同的准确性。 – user

快速看我没有看到任何错误 你应该记住,当你编译你的模型,keras随机初始化你的模型中的所有权重(你也可以指定你想要做什么,或者如果你不希望它是随机的,但默认情况通常很好)。所以每次编译时你都会得到不同的权重和不同的结果......给出足够的时代,他们应该都会收敛到相同的结果。

+0

感谢您的回复,我不希望它是随机的。我如何指定我的值?如何解决结果。我只是检查这是为什么我给了时代-1,它不会花太多时间来执行。一旦它得到解决,然后给予足够的时代。 – user

+1

你可以为每一层指定你想要的初始化,请参阅文档: https://keras.io/initializers/ 你可以选择一个或零,或身份矩阵(这可能是最好的.. )如果你想..确保你设置偏差为一个常数,而不是随机的。 但我真的不知道你为什么要这样做......初始随机性很好,并将以最佳方式收敛。如果将所有权重设置为相同的常数,则可能会影响收敛。 –

+0

感谢我将看到https://keras.io/initializers/,我想要不断的结果,因为我需要将训练有素的模型保存在一个目录中,然后将该模型加载到不同的脚本中并再次测试。它应该给出相同的结果。这只是为了节省时间。 – user

如果您正在运行“确切”该代码,请确保您完全创建了新模型

您并未加载模型,也没有将自己的权重添加到模型中。 您只需创建一个新的模型,并带有一组全新的权重。

所以,是的,它会产生不同的结果。没有任何错误。


你也许应该使用某种形式的,如果你想保持相同的模型“负荷保存的模型”(也许是model.load_weights())的。 (如果您有模型的地方保存)

还是应该“set_weights()”在某些时候创建模型后(如果你知道你想要什么权重,或者如果你有你的重量保存)

或者,如果您想要一个具有已知权重的新模型,则可以在每个图层中使用初始化器(如另一个答案中所述)。

+0

运行完全相同的代码并保存在目录中的训练模型,测试的准确性为69.269%,然后使用load_model('C:/User/Downloads/model.h5')和model.load_weights('C: /User/Downloads/weight_model.h5'),然后model.predict(testx)。我有66.6246%的测试精度。 – user