[英]How to manage epochs when doing Transfer Learning and Fine-tuning
我正在訓練 ResNet50 model,我想在初始訓練后應用微調。 這是我在沒有微調的情況下訓練 model 時:
# Train initial model without fine-tuning
initial_epochs = 100
history = model.fit(train_set, validation_data = dev_set, epochs=initial_epochs,verbose=1, callbacks=callbacks)
這是從上一個 epoch 進行微調和恢復的代碼:
# Train the model again for a few epochs
fine_tune_epochs = 5
total_epochs = initial_epochs + fine_tune_epochs
history_tuned = model.fit(train_set, validation_data = dev_set, initial_epoch=history.epoch[-1], epochs=total_epochs,verbose=1, callbacks=callbacks)
問題是,我已將 initial_epochs 設置為 100,因為我有 early_stopping。 因此,每個 model 可能會運行約 20 至約 40 個時期,然后停止。 所以 initial_epochs 並不是真正的 100。
這是 tensorboard 中的兩個培訓課程。 有沒有辦法從上次訓練 session 的時期恢復微調訓練? 如果我只是輸入 epochs = 5 並擁有 initial_epoch 原樣怎么辦?
或者我可以說:
# Train the model again for a few epochs
fine_tune_epochs = 5
total_epochs = len(history.epoch) + tuned_epochs # Get total number of epochs
history_tuned = model.fit(train_set, validation_data = dev_set, initial_epoch=history.epoch[-1], epochs=total_epochs,verbose=1, callbacks=callbacks)
運行第一次訓練 session:
history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid), callbacks=cb)
print(history.epoch)
print(len(history.epoch))
print(history.epoch[-1])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
10
9
然后:
tuned_epochs = 5
total_epochs = len(history.epoch) + tuned_epochs
history_tuned = model.fit(X_train, y_train, initial_epoch=history.epoch[-1], epochs=total_epochs, validation_data=(X_valid, y_valid), callbacks=cb)
這將告訴擬合 function 從最后一次訓練 session 的最后一個 epoch 具有初始 epoch,並且要運行的總 epoch 將是最后一次訓練會話中的所有 epoch + 5
我很確定,即使使用 TensorBoard,您看到微調從 epoch 0 重新開始,這也不是問題。 調用.fit(...)
會從您停止的時期繼續訓練。
這只是 TensorBoard 的一個可視化問題,但我知道這樣有點違反直覺。 我認為 model 不存儲訓練的 epoch 數,所以這就是發生這種情況的原因。
您的解決方案對我來說看起來不錯。 在fit()
中設置initial_epoch
應該會讓您從指定的時期重新開始訓練。 然后將epochs
設置為initial_epoch + x
,讓您訓練x
額外的 epoch。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.