2017-06-01 69 views
1

我有一個用於構建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

回答

0

快速看我沒有看到任何錯誤 你應該記住,當你編譯你的模型,keras隨機初始化你的模型中的所有權重(你也可以指定你想要做什麼,或者如果你不希望它是隨機的,但默認情況通常很好)。所以每次編譯時你都會得到不同的權重和不同的結果......給出足夠的時代,他們應該都會收斂到相同的結果。

+0

感謝您的回覆,我不希望它是隨機的。我如何指定我的值?如何解決結果。我只是檢查這是爲什麼我給了時代-1,它不會花太多時間來執行。一旦它得到解決,然後給予足夠的時代。 – user

+1

你可以爲每一層指定你想要的初始化,請參閱文檔: https://keras.io/initializers/ 你可以選擇一個或零,或身份矩陣(這可能是最好的.. )如果你想..確保你設置偏差爲一個常數,而不是隨機的。 但我真的不知道你爲什麼要這樣做......初始隨機性很好,並將以最佳方式收斂。如果將所有權重設置爲相同的常數,則可能會影響收斂。 –

+0

感謝我將看到https://keras.io/initializers/,我想要不斷的結果,因爲我需要將訓練有素的模型保存在一個目錄中,然後將該模型加載到不同的腳本中並再次測試。它應該給出相同的結果。這只是爲了節省時間。 – user

1

如果您正在運行「確切」該代碼,請確保您完全創建了新模型

您並未加載模型,也沒有將自己的權重添加到模型中。 您只需創建一個新的模型,並帶有一組全新的權重。

所以,是的,它會產生不同的結果。沒有任何錯誤。


你也許應該使用某種形式的,如果你想保持相同的模型「負荷保存的模型」(也許是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

相關問題