偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何判斷LSTM模型中的過擬合與欠擬合

開發(fā) 開發(fā)工具
判斷長短期記憶模型在序列預測問題上是否表現良好可能是一件困難的事。也許你會得到一個不錯的模型技術得分,但了解模型是較好的擬合,還是欠擬合/過擬合,以及模型在不同的配置條件下能否實現更好的性能是非常重要的。

在本教程中,你將發(fā)現如何診斷 LSTM 模型在序列預測問題上的擬合度。完成教程之后,你將了解:

  • 如何收集 LSTM 模型的訓練歷史并為其畫圖。
  • 如何判別一個欠擬合、較好擬合和過擬合的模型。
  • 如何通過平均多次模型運行來開發(fā)更魯棒的診斷方法。

讓我們開始吧。

1. Keras 中的訓練歷史

你可以通過回顧模型的性能隨時間的變化來更多地了解模型行為。

LSTM 模型通過調用 fit() 函數進行訓練。這個函數會返回一個叫作 history 的變量,該變量包含損失函數的軌跡,以及在模型編譯過程中被標記出來的任何一個度量指標。這些得分會在每一個 epoch 的***被記錄下來。

  1. ...  
  2. history = model.fit ( ... ) 

例如,如果你的模型被編譯用來優(yōu)化 log loss(binary_crossentropy),并且要在每一個 epoch 中衡量準確率,那么,log loss 和準確率將會在每一個訓練 epoch 的歷史記錄中被計算出,并記錄下來。

每一個得分都可以通過由調用 fit() 得到的歷史記錄中的一個 key 進行訪問。默認情況下,擬合模型時優(yōu)化過的損失函數為「loss」,準確率為「acc」。

  1. model.com pile ( loss='binary_crossentropy'optimizer='adam'metrics= [ 'accuracy' ] ) 
  2.  
  3. history = model.fit ( X, Y, epochs=100 ) 
  4.  
  5. print ( history.history [ 'loss' ] ) 
  6.  
  7. print ( history.history [ 'acc' ] ) 

Keras 還允許在擬合模型時指定獨立的驗證數據集,該數據集也可以使用同樣的損失函數和度量指標進行評估。

該功能可以通過在 fit() 中設置 validation_split 參數來啟用,以將訓練數據分割出一部分作為驗證數據集。

  1. history = model.fit ( X, Y, epochs=100validation_split=0.33 ) 

該功能也可以通過設置 validation_data 參數,并向其傳遞 X 和 Y 數據集元組來執(zhí)行。

  1. history = model.fit ( X, Y, epochs=100validation_data= ( valX, valY ) ) 

在驗證數據集上計算得到的度量指標會使用相同的命名,只是會附加一個「val_」前綴。

  1. ... 
  2. model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy']) 
  3. history =model.fit(X,Y,epochs=100,validation_split=0.33) 
  4. print(history.history['loss']) 
  5. print(history.history['acc']) 
  6. print(history.history['val_loss']) 
  7. print(history.history['val_acc']) 

2. 診斷圖

LSTM 模型的訓練歷史可用于診斷模型行為。你可以使用 Matplotlib 庫來進行性能的可視化,你可以將訓練損失和測試損失都畫出來以作比較,如下所示:

  1. frommatplotlib importpyplot 
  2. ... 
  3. history =model.fit(X,Y,epochs=100,validation_data=(valX,valY)) 
  4. pyplot.plot(history.history['loss']) 
  5. pyplot.plot(history.history['val_loss']) 
  6. pyplot.title('model train vs validation loss') 
  7. pyplot.ylabel('loss') 
  8. pyplot.xlabel('epoch') 
  9. pyplot.legend(['train','validation'],loc='upper right'
  10. pyplot.show() 

創(chuàng)建并檢查這些圖有助于啟發(fā)你找到新的有可能優(yōu)化模型性能的配置。

接下來,我們來看一些例子。我們將從損失最小化的角度考慮在訓練集和驗證集上的建模技巧。

3. 欠擬合實例

欠擬合模型就是在訓練集上表現良好而在測試集上性能較差的模型。

這個可以通過以下情況來診斷:訓練的損失曲線低于驗證的損失曲線,并且驗證集中的損失函數表現出了有可能被優(yōu)化的趨勢。

下面是一個人為設計的小的欠擬合 LSTM 模型。

  1. fromkeras.models importSequential 
  2. fromkeras.layers importDense 
  3. fromkeras.layers importLSTM 
  4. frommatplotlib importpyplot 
  5. fromnumpy importarray 
  6. # return training data 
  7. defget_train(): 
  8. seq =[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]] 
  9. seq =array(seq) 
  10. X,y =seq[:,0],seq[:,1] 
  11. XX =X.reshape((len(X),1,1)) 
  12. returnX,y 
  13. # return validation data 
  14. defget_val(): 
  15. seq =[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]] 
  16. seq =array(seq) 
  17. X,y =seq[:,0],seq[:,1] 
  18. XX =X.reshape((len(X),1,1)) 
  19. returnX,y 
  20. # define model 
  21. model.add(LSTM(10,input_shape=(1,1))) 
  22. model.add(Dense(1,activation='linear')) 
  23. # compile model 
  24. model.compile(loss='mse',optimizer='adam'
  25. # fit model 
  26. X,y =get_train() 
  27. valX,valY =get_val() 
  28. history =model.fit(X,y,epochs=100,validation_data=(valX,valY),shuffle=False
  29. # plot train and validation loss 
  30. pyplot.plot(history.history['loss']) 
  31. pyplot.plot(history.history['val_loss']) 
  32. pyplot.title('model train vs validation loss') 
  33. pyplot.ylabel('loss') 
  34. pyplot.xlabel('epoch') 
  35. pyplot.legend(['train','validation'],loc='upper right'
  36. pyplot.show() 

運行這個實例會產生一個訓練損失和驗證損失圖,該圖顯示欠擬合模型特點。在這個案例中,模型性能可能隨著訓練 epoch 的增加而有所改善。

欠擬合模型的診斷圖

欠擬合模型的診斷圖

另外,如果模型在訓練集上的性能比驗證集上的性能好,并且模型性能曲線已經平穩(wěn)了,那么這個模型也可能欠擬合。下面就是一個缺乏足夠的記憶單元的欠擬合模型的例子。

  1. fromkeras.models importSequential 
  2. fromkeras.layers importDense 
  3. fromkeras.layers importLSTM 
  4. frommatplotlib importpyplot 
  5. fromnumpy importarray 
  6. # return training data 
  7. defget_train(): 
  8. seq =[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]] 
  9. seq =array(seq) 
  10. X,y =seq[:,0],seq[:,1] 
  11. XX =X.reshape((5,1,1)) 
  12. returnX,y 
  13. # return validation data 
  14. defget_val(): 
  15. seq =[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]] 
  16. seq =array(seq) 
  17. X,y =seq[:,0],seq[:,1] 
  18. XX =X.reshape((len(X),1,1)) 
  19. returnX,y 
  20. # define model 
  21. model.add(LSTM(1,input_shape=(1,1))) 
  22. model.add(Dense(1,activation='linear')) 
  23. # compile model 
  24. model.compile(loss='mae',optimizer='sgd'
  25. # fit model 
  26. X,y =get_train() 
  27. valX,valY =get_val() 
  28. history =model.fit(X,y,epochs=300,validation_data=(valX,valY),shuffle=False
  29. # plot train and validation loss 
  30. pyplot.plot(history.history['loss']) 
  31. pyplot.plot(history.history['val_loss']) 
  32. pyplot.title('model train vs validation loss') 
  33. pyplot.ylabel('loss') 
  34. pyplot.xlabel('epoch') 
  35. pyplot.legend(['train','validation'],loc='upper right'
  36. pyplot.show() 

運行這個實例會展示出一個存儲不足的欠擬合模型的特點。

在這個案例中,模型的性能也許會隨著模型的容量增加而得到改善,例如隱藏層中記憶單元的數目或者隱藏層的數目增加。

欠擬合模型的狀態(tài)診斷線圖

欠擬合模型的狀態(tài)診斷線圖

4. 良好擬合實例

良好擬合的模型就是模型的性能在訓練集和驗證集上都比較好。

這可以通過訓練損失和驗證損失都下降并且穩(wěn)定在同一個點進行診斷。

下面的小例子描述的就是一個良好擬合的 LSTM 模型。

  1. fromkeras.models importSequential 
  2. fromkeras.layers importDense 
  3. fromkeras.layers importLSTM 
  4. frommatplotlib importpyplot 
  5. fromnumpy importarray 
  6. # return training data 
  7. defget_train(): 
  8. seq =[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]] 
  9. seq =array(seq) 
  10. X,y =seq[:,0],seq[:,1] 
  11. XX =X.reshape((5,1,1)) 
  12. returnX,y 
  13. # return validation data 
  14. defget_val(): 
  15. seq =[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]] 
  16. seq =array(seq) 
  17. X,y =seq[:,0],seq[:,1] 
  18. XX =X.reshape((len(X),1,1)) 
  19. returnX,y 
  20. # define model 
  21. model.add(LSTM(10,input_shape=(1,1))) 
  22. model.add(Dense(1,activation='linear')) 
  23. # compile model 
  24. model.compile(loss='mse',optimizer='adam'
  25. # fit model 
  26. X,y =get_train() 
  27. valX,valY =get_val() 
  28. history =model.fit(X,y,epochs=800,validation_data=(valX,valY),shuffle=False
  29. # plot train and validation loss 
  30. pyplot.plot(history.history['loss']) 
  31. pyplot.plot(history.history['val_loss']) 
  32. pyplot.title('model train vs validation loss') 
  33. pyplot.ylabel('loss') 
  34. pyplot.xlabel('epoch') 
  35. pyplot.legend(['train','validation'],loc='upper right'
  36. pyplot.show() 

運行這個實例可以創(chuàng)建一個線圖,圖中訓練損失和驗證損失出現重合。

理想情況下,我們都希望模型盡可能是這樣,盡管面對大量數據的挑戰(zhàn),這似乎不太可能。

良好擬合模型的診斷線圖

良好擬合模型的診斷線圖

5. 過擬合實例

過擬合模型即在訓練集上性能良好且在某一點后持續(xù)增長,而在驗證集上的性能到達某一點然后開始下降的模型。

這可以通過線圖來診斷,圖中訓練損失持續(xù)下降,驗證損失下降到拐點開始上升。

下面這個實例就是一個過擬合 LSTM 模型。

  1. fromkeras.models importSequential 
  2. fromkeras.layers importDense 
  3. fromkeras.layers importLSTM 
  4. frommatplotlib importpyplot 
  5. fromnumpy importarray 
  6. # return training data 
  7. defget_train(): 
  8. seq =[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]] 
  9. seq =array(seq) 
  10. X,y =seq[:,0],seq[:,1] 
  11. XX =X.reshape((5,1,1)) 
  12. returnX,y 
  13. # return validation data 
  14. defget_val(): 
  15. seq =[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]] 
  16. seq =array(seq) 
  17. X,y =seq[:,0],seq[:,1] 
  18. XX =X.reshape((len(X),1,1)) 
  19. returnX,y 
  20. # define model 
  21. model.add(LSTM(10,input_shape=(1,1))) 
  22. model.add(Dense(1,activation='linear')) 
  23. # compile model 
  24. model.compile(loss='mse',optimizer='adam'
  25. # fit model 
  26. X,y =get_train() 
  27. valX,valY =get_val() 
  28. history =model.fit(X,y,epochs=1200,validation_data=(valX,valY),shuffle=False
  29. # plot train and validation loss 
  30. pyplot.plot(history.history['loss'][500:]) 
  31. pyplot.plot(history.history['val_loss'][500:]) 
  32. pyplot.title('model train vs validation loss') 
  33. pyplot.ylabel('loss') 
  34. pyplot.xlabel('epoch') 
  35. pyplot.legend(['train','validation'],loc='upper right'
  36. pyplot.show() 

運行這個實例會創(chuàng)建一個展示過擬合模型在驗證集中出現拐點的曲線圖。

這也許是進行太多訓練 epoch 的信號。

在這個案例中,模型會在拐點處停止訓練。另外,訓練樣本的數目可能會增加。

過擬合模型的診斷線圖

過擬合模型的診斷線圖

6. 多次運行實例

LSTM 是隨機的,這意味著每次運行時都會得到一個不同的診斷圖。

多次重復診斷運行很有用(如 5、10、30)。每次運行的訓練軌跡和驗證軌跡都可以被繪制出來,以更魯棒的方式記錄模型隨著時間的行為軌跡。

以下實例多次運行同樣的實驗,然后繪制每次運行的訓練損失和驗證損失軌跡。

  1. fromkeras.models importSequential 
  2. fromkeras.layers importDense 
  3. fromkeras.layers importLSTM 
  4. frommatplotlib importpyplot 
  5. fromnumpy importarray 
  6. frompandas importDataFrame 
  7. # return training data 
  8. defget_train(): 
  9. seq =[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]] 
  10. seq =array(seq) 
  11. X,y =seq[:,0],seq[:,1] 
  12. XX =X.reshape((5,1,1)) 
  13. returnX,y 
  14. # return validation data 
  15. defget_val(): 
  16. seq =[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]] 
  17. seq =array(seq) 
  18. X,y =seq[:,0],seq[:,1] 
  19. XX =X.reshape((len(X),1,1)) 
  20. returnX,y 
  21. # collect data across multiple repeats 
  22. train =DataFrame() 
  23. val =DataFrame() 
  24. fori inrange(5): 
  25. # define model 
  26. model.add(LSTM(10,input_shape=(1,1))) 
  27. model.add(Dense(1,activation='linear')) 
  28. # compile model 
  29. model.compile(loss='mse',optimizer='adam'
  30. X,y =get_train() 
  31. valX,valY =get_val() 
  32. # fit model 
  33. history =model.fit(X,y,epochs=300,validation_data=(valX,valY),shuffle=False
  34. # story history 
  35. train[str(i)]=history.history['loss'] 
  36. val[str(i)]=history.history['val_loss'] 
  37. # plot train and validation loss across multiple runs 
  38. pyplot.plot(train,color='blue',label='train'
  39. pyplot.plot(val,color='orange',label='validation'
  40. pyplot.title('model train vs validation loss') 
  41. pyplot.ylabel('loss') 
  42. pyplot.xlabel('epoch') 
  43. pyplot.show() 

從下圖中,我們可以在 5 次運行中看到欠擬合模型的通常趨勢,該案例強有力地證明增加訓練 epoch 次數的有效性。

模型多次運行的診斷線圖

模型多次運行的診斷線圖

擴展閱讀

如果你想更深入地了解這方面的內容,這一部分提供了更豐富的資源。

  • Keras 的歷史回調 API(History Callback Keras API,https://keras.io/callbacks/#history)
  • 維基百科中關于機器學習的學習曲線(Learning Curve in Machine Learning on Wikipedia,https://en.wikipedia.org/wiki/Learning_curve#In_machine_learning)
  • 維基百科上關于過擬合的描述(Overfitting on Wikipedia,https://en.wikipedia.org/wiki/Overfitting)

原文:https://machinelearningmastery.com/diagnose-overfitting-underfitting-lstm-models/

【本文是51CTO專欄機構“機器之心”的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】

 

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2024-04-29 14:54:36

機器學習過擬合模型人工智能

2022-08-10 15:56:40

機器學習算法深度學習

2023-03-06 14:12:47

深度學習

2020-06-05 08:38:39

python散點圖擬合

2021-01-20 15:30:25

模型人工智能深度學習

2019-12-20 09:15:48

神經網絡數據圖形

2020-07-14 10:40:49

Keras權重約束神經網絡

2022-09-25 23:19:01

機器學習決策樹Python

2025-03-07 08:50:00

AI生成技術

2024-08-27 15:33:57

2025-01-20 09:21:00

2025-06-20 09:03:00

2023-04-10 15:48:41

代碼計算

2025-01-09 09:29:57

2023-10-30 10:29:50

C++最小二乘法

2020-06-05 18:57:41

BiLSTMCRF算法

2018-07-03 09:12:23

深度學習正則化Python

2025-03-21 13:25:14

2022-05-30 15:44:33

模型訓練GAN
點贊
收藏

51CTO技術棧公眾號