日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何判斷LSTM模型中的過擬合與欠擬合

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

樂安ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

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

讓我們開始吧。

1. Keras 中的訓(xùn)練歷史

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

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

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

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

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

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

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

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

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

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

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

在驗證數(shù)據(jù)集上計算得到的度量指標(biāo)會使用相同的命名,只是會附加一個「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 模型的訓(xùn)練歷史可用于診斷模型行為。你可以使用 Matplotlib 庫來進行性能的可視化,你可以將訓(xùn)練損失和測試損失都畫出來以作比較,如下所示:

 
 
 
 
  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)化模型性能的配置。

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

3. 欠擬合實例

欠擬合模型就是在訓(xùn)練集上表現(xiàn)良好而在測試集上性能較差的模型。

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

下面是一個人為設(shè)計的小的欠擬合 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()

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

欠擬合模型的診斷圖

另外,如果模型在訓(xùn)練集上的性能比驗證集上的性能好,并且模型性能曲線已經(jīng)平穩(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()

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

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

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

4. 良好擬合實例

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

這可以通過訓(xùn)練損失和驗證損失都下降并且穩(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)建一個線圖,圖中訓(xùn)練損失和驗證損失出現(xiàn)重合。

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

良好擬合模型的診斷線圖

5. 過擬合實例

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

這可以通過線圖來診斷,圖中訓(xùn)練損失持續(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)建一個展示過擬合模型在驗證集中出現(xiàn)拐點的曲線圖。

這也許是進行太多訓(xùn)練 epoch 的信號。

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

過擬合模型的診斷線圖

6. 多次運行實例

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

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

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

 
 
 
 
  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 次運行中看到欠擬合模型的通常趨勢,該案例強有力地證明增加訓(xùn)練 epoch 次數(shù)的有效性。

模型多次運行的診斷線圖

擴展閱讀

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

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

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

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


標(biāo)題名稱:如何判斷LSTM模型中的過擬合與欠擬合
URL網(wǎng)址:http://www.5511xx.com/article/djjjsic.html