【天池赛事】零基础入门语义分割-地表建筑物识别 Task5:模型训练与验证
【天池賽事】零基礎入門語義分割-地表建筑物識別
-
Task1:賽題理解與 baseline(3 天)
– 學習主題:理解賽題內容解題流程
– 學習內容:賽題理解、數據讀取、比賽 baseline 構建
– 學習成果:比賽 baseline 提交 -
Task2:數據擴增方法(3 天)
– 學習主題:語義分割任務中數據擴增方法
– 學習內容:掌握語義分割任務中數據擴增方法的細節和使用
– 學習成果:數據擴增方法的實踐 -
Task3:網絡模型結構發展(3 天)
– 學習主題:掌握語義分割模型的發展脈絡
– 學習內容: FCN、 Unet、 DeepLab、 SegNet、 PSPNet
– 學習成果:多種網絡模型的搭建 -
Task4:評價函數與損失函數(3 天)
– 學習主題:語義分割模型各種評價函數與損失函數
– 學習內容: Dice、 IoU、 BCE、 Focal Loss、 Lovász-Softmax
– 學習成果:評價/損失函數的實踐 -
Task5:模型訓練與驗證(3 天)
– 學習主題:數據劃分方法
– 學習內容:三種數據劃分方法、模型調參過程
– 學習成果:數據劃分具體操作 -
Task6:分割模型模型集成(3 天)
– 學習主題:語義分割模型集成方法
– 學習內容: LookaHead、 SnapShot、 SWA、 TTA
– 學習成果:模型集成思路
Task5:模型訓練與驗證
- 1 學習目標
- 2 構造驗證集
- 留出法(Hold-Out)
- 交叉驗證法(Cross Validation,CV)
- 自助采樣法(BootStrap)
- 3 模型訓練與驗證
- 4 模型保存與加載
- 5 模型調參流程
- 6 本章小節
一個成熟合格的深度學習訓練流程至少具備以下功能:
- 在訓練集上進行訓練,并在驗證集上進行驗證;
- 模型可以保存最優的權重,并讀取權重;
- 記錄下訓練集和驗證集的精度,便于調參。
為此本章將從構建驗證集、模型訓練和驗證、模型保存與加載和模型調參幾個部分講解,在部分小節中將會結合Pytorch代碼進行講解。
1 學習目標
- 理解驗證集的作用,并使用訓練集和驗證集完成訓練
- 學會使用Pytorch環境下的模型讀取和加載,并了解調參流程
2 構造驗證集
在機器學習模型(特別是深度學習模型)的訓練過程中,模型是非常容易過擬合的。深度學習模型在不斷的訓練過程中訓練誤差會逐漸降低,但測試誤差的走勢則不一定。
在模型的訓練過程中,模型只能利用訓練數據來進行訓練,模型并不能接觸到測試集上的樣本。因此模型如果將訓練集學的過好,模型就會記住訓練樣本的細節,導致模型在測試集的泛化效果較差,這種現象稱為過擬合(Overfitting)。與過擬合相對應的是欠擬合(Underfitting),即模型在訓練集上的擬合效果較差。
如圖所示:隨著模型復雜度和模型訓練輪數的增加,CNN模型在訓練集上的誤差會降低,但在測試集上的誤差會逐漸降低,然后逐漸升高,而我們為了追求的是模型在測試集上的精度越高越好。
導致模型過擬合的情況有很多種原因,其中最為常見的情況是模型復雜度(Model Complexity )太高,導致模型學習到了訓練數據的方方面面,學習到了一些細枝末節的規律。
解決上述問題最好的解決方法:構建一個與測試集盡可能分布一致的樣本集(可稱為驗證集),在訓練過程中不斷驗證模型在驗證集上的精度,并以此控制模型的訓練。
在給定賽題后,賽題方會給定訓練集和測試集兩部分數據。參賽者需要在訓練集上面構建模型,并在測試集上面驗證模型的泛化能力。因此參賽者可以通過提交模型對測試集的預測結果,來驗證自己模型的泛化能力。同時參賽方也會限制一些提交的次數限制,以此避免參賽選手“刷分”。
在一般情況下,參賽選手也可以自己在本地劃分出一個驗證集出來,進行本地驗證。訓練集、驗證集和測試集分別有不同的作用:
- 訓練集(Train Set):模型用于訓練和調整模型參數;
- 驗證集(Validation Set):用來驗證模型精度和調整模型超參數;
- 測試集(Test Set):驗證模型的泛化能力。
因為訓練集和驗證集是分開的,所以模型在驗證集上面的精度在一定程度上可以反映模型的泛化能力。在劃分驗證集的時候,需要注意驗證集的分布應該與測試集盡量保持一致,不然模型在驗證集上的精度就失去了指導意義。
既然驗證集這么重要,那么如何劃分本地驗證集呢。在一些比賽中,賽題方會給定驗證集;如果賽題方沒有給定驗證集,那么參賽選手就需要從訓練集中拆分一部分得到驗證集。驗證集的劃分有如下幾種方式:
留出法(Hold-Out)
直接將訓練集劃分成兩部分,新的訓練集和驗證集。這種劃分方式的優點是最為直接簡單;缺點是只得到了一份驗證集,有可能導致模型在驗證集上過擬合。留出法應用場景是數據量比較大的情況。
交叉驗證法(Cross Validation,CV)
將訓練集劃分成K份,將其中的K-1份作為訓練集,剩余的1份作為驗證集,循環K訓練。這種劃分方式是所有的訓練集都是驗證集,最終模型驗證精度是K份平均得到。這種方式的優點是驗證集精度比較可靠,訓練K次可以得到K個有多樣性差異的模型;CV驗證的缺點是需要訓練K次,不適合數據量很大的情況。
自助采樣法(BootStrap)
通過有放回的采樣方式得到新的訓練集和驗證集,每次的訓練集和驗證集都是有區別的。這種劃分方式一般適用于數據量較小的情況。
在本次賽題中已經劃分為驗證集,因此選手可以直接使用訓練集進行訓練,并使用驗證集進行驗證精度(當然你也可以合并訓練集和驗證集,自行劃分驗證集)。
當然這些劃分方法是從數據劃分方式的角度來講的,在現有的數據比賽中一般采用的劃分方法是留出法和交叉驗證法。如果數據量比較大,留出法還是比較合適的。當然任何的驗證集的劃分得到的驗證集都是要保證訓練集-驗證集-測試集的分布是一致的,所以如果不管劃分何種的劃分方式都是需要注意的。
這里的分布一般指的是與標簽相關的統計分布,比如在分類任務中“分布”指的是標簽的類別分布,訓練集-驗證集-測試集的類別分布情況應該大體一致;如果標簽是帶有時序信息,則驗證集和測試集的時間間隔應該保持一致。
3 模型訓練與驗證
在本節我們目標使用Pytorch來完成CNN的訓練和驗證過程,CNN網絡結構與之前的章節中保持一致。我們需要完成的邏輯結構如下:
- 構造訓練集和驗證集;
- 每輪進行訓練和驗證,并根據最優驗證集精度保存模型。
其中每個Epoch的訓練代碼如下:
def train(train_loader, model, criterion, optimizer, epoch):# 切換模型為訓練模式model.train()for i, (input, target) in enumerate(train_loader):# 正向傳播# 計算損失# 反向傳播pass其中每個Epoch的驗證代碼如下:
def validate(val_loader, model, criterion):# 切換模型為預測模型model.eval()val_loss = []# 不記錄模型梯度信息with torch.no_grad():for i, (input, target) in enumerate(val_loader):# 正向傳播# 計算損失pass4 模型保存與加載
在Pytorch中模型的保存和加載非常簡單,比較常見的做法是保存和加載模型參數:
torch.save(model_object.state_dict(), 'model.pt')
model.load_state_dict(torch.load(' model.pt'))
5 模型調參流程
深度學習原理少但實踐性非常強,基本上很多的模型的驗證只能通過訓練來完成。同時深度學習有眾多的網絡結構和超參數,因此需要反復嘗試。訓練深度學習模型需要GPU的硬件支持,也需要較多的訓練時間,如何有效的訓練深度學習模型逐漸成為了一門學問。
深度學習有眾多的訓練技巧,比較推薦的閱讀鏈接有:
- http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html
- http://karpathy.github.io/2019/04/25/recipe/
本節挑選了常見的一些技巧來講解,并針對本次賽題進行具體分析。與傳統的機器學習模型不同,深度學習模型的精度與模型的復雜度、數據量、正則化、數據擴增等因素直接相關。所以當深度學習模型處于不同的階段(欠擬合、過擬合和完美擬合)的情況下,大家可以知道可以什么角度來繼續優化模型。
在參加本次比賽的過程中,我建議大家以如下邏輯完成:
- 初步構建簡單的CNN模型,不用特別復雜,跑通訓練、驗證和預測的流程;
- 簡單CNN模型的損失會比較大,嘗試增加模型復雜度,并觀察驗證集精度;
- 在增加模型復雜度的同時增加數據擴增方法,直至驗證集精度不變。
6 本章小節
本章以深度學習模型的訓練和驗證為基礎,講解了驗證集劃分方法、模型訓練與驗證、模型保存和加載以及模型調參流程。
需要注意的是模型復雜度是相對的,并不一定模型越復雜越好。在有限設備和有限時間下,需要選擇能夠快速迭代訓練的模型。
- 掌握模型訓練&模型調參過程;
- 掌握數據劃分方法和具體實踐;
總結
以上是生活随笔為你收集整理的【天池赛事】零基础入门语义分割-地表建筑物识别 Task5:模型训练与验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【天池赛事】零基础入门语义分割-地表建筑
- 下一篇: 【天池赛事】零基础入门语义分割-地表建筑