2017-07-11 142 views
4

我試圖訓練LSTM來處理一些二進制分類問題。訓練結束後繪製loss曲線時,會出現奇怪的選區。下面是一些例子:在Keras培訓LSTM時出現奇怪的損失曲線

enter image description here

enter image description here

下面是基本的代碼

model = Sequential() 
model.add(recurrent.LSTM(128, input_shape = (columnCount,1), return_sequences=True)) 
model.add(Dropout(0.5)) 
model.add(recurrent.LSTM(128, return_sequences=False)) 
model.add(Dropout(0.5)) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 
model.compile(optimizer='adam', 
      loss='binary_crossentropy', 
      metrics=['accuracy']) 

new_train = X_train[..., newaxis] 

history = model.fit(new_train, y_train, nb_epoch=500, batch_size=100, 
        callbacks = [EarlyStopping(monitor='val_loss', min_delta=0.0001, patience=2, verbose=0, mode='auto'), 
           ModelCheckpoint(filepath="model.h5", verbose=0, save_best_only=True)], 
        validation_split=0.1) 

# list all data in history 
print(history.history.keys()) 
# summarize history for loss 
plt.plot(history.history['loss']) 
plt.plot(history.history['val_loss']) 
plt.title('model loss') 
plt.ylabel('loss') 
plt.xlabel('epoch') 
plt.legend(['train', 'test'], loc='upper left') 
plt.show() 

我不明白爲什麼發生的選秀權?有任何想法嗎?

回答

4

爲什麼有這樣的事情發生很多可能性:

  1. 你的參數軌跡改變了它的吸引力的盆地 - 這意味着你的系統留下了一個穩定的彈道,並切換到另一個。這可能是由於隨機化,例如,批次抽樣或輟學。

  2. LSTM不穩定 - LSTM s的認爲是在培訓方面極不穩定。還有報道稱,他們經常爲了穩定而花費很多時間。

由於最新的研究(例如,來自here)我建議你減少批量大小和離開它的多個時期。我也會嘗試檢查是否網絡的拓撲結構不需要根據需要學習的模式數量進行復雜的(或簡單的)。我也會嘗試切換到GRUSimpleRNN

+0

感謝您的回答。我會嘗試一下,讓你知道結果。 – nabroyan

+0

偉大的提示,@ nabroyan是的,幾乎總是這可以歸因於太大的批次。我也會嘗試不同的優化器,rmsprop和adadelta以及調整後的學習速率有時可以成爲一個很好的選擇。如果沒有什麼可以幫助您以較低的學習率直接下降到SGD。 –