深度学习过拟合解决方案
本文轉自:https://blog.csdn.net/zhang2010hao/article/details/89339327
1.29.深度學習過擬合解決方案
1.29.1.解決方案
對于深度學習網絡的過擬合,一般的解決方案有:
?Early stop
在模型訓練過程中,提前終止。這里可以根據具體指標設置early stop的條件,比如可以是loss的大小,或者acc/f1等值的epoch之間的大小對比。
?More data
更多的數據集。增加樣本也是一種解決方案,根據不同場景和數據不同的數據增強方法。
?正則化
常用的有L1,L2正則化
?Droup Out
以一定的概率使某些神經元停止工作
?BatchNorm
對神經元作歸一化
1.29.2.實現
這里主要講述一下在pytorch中的過擬合解決方案,early stop和more data都是對于特定的任務去進行的,不同的任務有不同的解決方案,這里不做進一步說明。在pytorch框架下后面幾種解決方案是有統一的結構或者解決辦法的,這里一一道來。
?正則化
torch.optim集成了很多優化器,如SGD,Adadelta,Adam,Adagrad,RMSprop等,這些優化器中有一個參數weight_decay,用于指定權值衰減率,相當于L2正則化中的λ參數,注意torch.optim集成的優化器只有L2正則化方法,api中參數weight_decay 的解析是:weight_decay (float, optional): weight decay (L2 penalty) (default: 0),這里可以看出其weight_decay就是正則化項的作用??梢匀缦略O置L2正則化:
但是這種方法存在幾個問題:
(1)一般正則化,只是對模型的權重W參數進行懲罰,而偏置參數b是不進行懲罰的,而torch.optim的優化器weight_decay參數指定的權值衰減是對網絡中的所有參數,包括權值w和偏置b同時進行懲罰。很多時候如果對b 進行L2正則化將會導致嚴重的欠擬合,因此這個時候一般只需要對權值w進行正則即可。(PS:這個我真不確定,源碼解析是 weight decay (L2 penalty) ,但有些網友說這種方法會對參數偏置b也進行懲罰,可解惑的網友給個明確的答復)
(2)缺點:torch.optim的優化器只能實現L2正則化,不能實現L1正則化。
(3)根據正則化的公式,加入正則化后,loss會變原來大,比如weight_decay=1的loss為10,那么weight_decay=100時,loss輸出應該也提高100倍左右。而采用torch.optim的優化器的方法,如果你依然采用loss_fun= nn.CrossEntropyLoss()進行計算loss,你會發現,不管你怎么改變weight_decay的大小,loss會跟之前沒有加正則化的大小差不多。這是因為你的loss_fun損失函數沒有把權重W的損失加上。
1.29.3.Drop out實現
pytorch中有兩種方式可以實現dropout
1)使用nn.Dropout類,先初始化掉該類,然后可以在后面直接調用
2)使用torch.nn.functional.dropout函數實現dropout
# -*- coding: UTF-8 -*-import torch.nn as nnclass Exmp(nn.Module):def __init__(drop_rate):self.dropout = nn.Dropout(drop_rate)...def forward():...output = self.dropout(input)...上面只有一種示例,在實際使用中第二種更加靈活,可以在不同的層之間使用不同的drop_rate, 第一種的好處是可以一次初始化后面每次dropout保持一致。
1.29.4.BatchNorm
批標準化通俗來說就是對每一層神經網絡進行標準化 (normalize) 處理,具體的原理我再次不做贅述,網上資料很多。
pytorch中BatchNorm有BatchNorm1d、BatchNorm2d、BatchNorm3d三種,根據具體數據選擇不同的BatchNorm,BatchNorm層的使用與普通的層使用方法類似。
總結
以上是生活随笔為你收集整理的深度学习过拟合解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奔驰唯雅诺左边右边出风口无冷风怎么办你好
- 下一篇: 中战集团是个什么公司