ML 新手,我想知道我遺漏了什么或做錯了什么。
我試圖弄清楚為什么我的資料在應用提前停止和輟學時欠擬合,但是當我不使用提前停止或輟學時,擬合似乎沒問題......
我正在使用的資料集:

結合 earlystopping 和 dropout,資料看起來不合適:
model = Sequential()
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))
early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=25)
model.compile(optimizer='adam', loss='mae')
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600, callbacks=[early_stopping])

我試圖弄清楚為什么當結果如此遙遠時提前停止會停止。我猜這個模型會一直持續到 600 個 epoch 結束,但是提前停止會在 300 左右拔掉插頭。
我可能做錯了什么,但我無法弄清楚,所以任何見解都會受到贊賞。先感謝您 :)
uj5u.com熱心網友回復:
它定義了性能度量并指定是最大化還是最小化它。
然后 Keras 在適當的時期停止訓練。指定verbose=1時,可以在keras中停止訓練時在螢屏上輸出。
es = EarlyStopping(monitor='val_loss', mode='min')
立即停止可能沒有效果,因為性能并沒有提高。耐心定義了允許不提高性能的 epoch 的次數。參與度是一個相當主觀的標準。可以根據使用的資料和使用的模型的設計來改變最佳值。
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)
當訓練被模型選擇提前停止物件停止時,狀態通常會比之前的模型有更高的驗證錯誤。因此,可以控制提前停止,使模型的驗證誤差不再通過在某個時間點停止模型的訓練來降低,但停止狀態不會是最好的模型。因此,需要存盤驗證性能最好的模型,為此,keras 中存在名為 Model Checkpoint 的物件。此物件監控驗證錯誤,如果驗證性能優于前一個 epoch,則此時無條件存盤引數。通過這個,當訓練停止時,可以回傳具有最高驗證性能的模型。
from keras.callbacks import ModelCheckpoint
mc = ModelCheckpoint ('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)
在回呼引數中,允許存盤最佳模型。
hist = model.fit(train_x, train_y, nb_epoch=10,
batch_size=10, verbose=2, validation_split=0.2,
callbacks=[early_stopping, mc])
在您的情況下,耐心 25 表示當參考值連續提高不超過 25 次時是否結束。
from keras.callbacks import ModelCheckpoint
model = Sequential()
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))
early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=25, verbose=1)
mc = ModelCheckpoint ('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)
model.compile(optimizer='adam', loss='mae')
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600, callbacks=[early_stopping, mc])
uj5u.com熱心網友回復:
我推薦兩件事。在早停回呼中設定引數
restore_best_weights=True
這樣,如果提前停止回呼激活,您的模型將設定為具有最低驗證損失的時期的權重。為了獲得更低的驗證損失,我建議您使用回呼 ReduceLROnPlateau。我為這些回呼推薦的代碼如下所示。
estop=tf.keras.callbacks.EarlyStopping( monitor="val_loss", patience=4,
verbose=1, estore_best_weights=True)
rlronp=tf.keras.callbacks.ReduceLROnPlateau(monitor="val_loss", factor=0.5,
patience=2, verbose=1)
callbacks=[estop, rlronp]
在 model.fit 中設定引數 callbacks=callbacks。將 epochs 設定為較大的數字,以便可能會激活 estop 回呼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489708.html
