前情提要: 我們昨天花了很多時間把最後一段code補上,並且能正常訓練,以下來補補沒講到的部分。
這裡的ModelCheckpoint有蠻多參數的,以下這幾個是我常用的,會用這個的原因是因為,在pytorch的時候你甚麼時候要存checkpoint? 整個訓練完? 還是存評分最高的? 還是固定存後三個epoch? 不管是哪個pytorch都要自己用手寫的去判斷,那在lightning就是透過ModelCheckpoint來處理這些東西
所以以上合在一起就是,我儲存valid_acc_epoch前五高的model
callbacks可以有多個,你可以同時用valid_acc_epoch和loss來儲存,甚至你有多種metrics,可以依照那些metrics來做。
if task == 'train':
callbacks = []
dirpath = "./model"
checkpoint_acc = ModelCheckpoint(
save_top_k = 5,
monitor = "valid_acc_epoch",
mode = "max",
dirpath = dirpath,
filename = "model_{epoch:02d}_{valid_acc_epoch:.2f}",
save_last = True,
)
callbacks.append(checkpoint_acc)
trainer = pl.Trainer(
max_epochs = max_epochs,
callbacks = callbacks,
gradient_clip_val = 2.0,
# devices = [0, 1] # 多GPU訓練
)
trainer.fit(model=model)
這個也是很多參數,可以看官方文檔來看要怎麼下,我自己用到的就這幾個:
以上只是這次實作當中用到的,稍微做個簡單的說明,其實還有蠻多參數或函數沒有講解到,最後補充個EarlyStopping,雖然我自己本身沒用到,不過可以嘗試看看,簡單來說就是連續幾個epoch出來的結果,如果沒有比較好,那麼我就停止訓練,有點防止浪費時間的概念。
有時候我們用一些資料訓練出了一個不錯的model,此時如果有新增資料想要繼續訓練,或者使用人家的model來繼續訓練,通常稱之為fine-tune,此時可以透過以下方式,來將上次訓練完的參數載進來,接續著訓練。
# 上面的部分省略跟train完全一樣
ckpt_path = "/ws/code/Day8/model/last.ckpt"
ckpt = torch.load(ckpt_path)["state_dict"]
example.load_state_dict(ckpt)
trainer.fit(model = example)
在此範例當中,我們是直接拿人家已經分好train test的資料集來做訓練,那實際自己的資料如何分配比例呢??
分配比例之前我們要先知道資料集分成三種:
上面提到類似跟不類似,以及有個outside的詞,以下舉個例子:
假設我想做一個動物分類,此時我有狗狗,貓咪…
假設我的訓練集裡面都是柴柴的圖片,那麼驗證集也會是柴柴的圖片,只是跟訓練集裡面是"不同隻"柴柴,此時的outside test可能就是哈士奇"不同種類"的狗,那預期不管是柴柴還是哈士奇都是要標出狗狗的標籤,當你要應用模型的時候,一定是任何場景都會碰到,所以透過outside test來測試效果好不好。
最後比例分配有很多種
在百萬筆資料大部分的比例都會給訓練,因為百萬的1%也已經夠多了,足以測出模型的性能,通常在文字方面百萬筆是很正常的。
今天就先更新到這囉~ 主要把一些觀念補上,後續也會把之前的觀念補上,並加上一些新東西。