日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch框架学习十六——正则化与Dropout

發(fā)布時間:2024/7/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch框架学习十六——正则化与Dropout 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

PyTorch框架學(xué)習(xí)十六——正則化與Dropout

  • 一、泛化誤差
  • 二、L2正則化與權(quán)值衰減
  • 三、正則化之Dropout
  • 補充:

這次筆記主要關(guān)注防止模型過擬合的兩種方法:正則化與Dropout。

一、泛化誤差

一般模型的泛化誤差可以被分解為三部分:偏差、方差與噪聲。按照周志華老師西瓜書中的定義,這三者分別如下所示:

  • 偏差:度量學(xué)習(xí)算法的期望預(yù)測與真實結(jié)果的偏離程度,即刻畫了學(xué)習(xí)算法本身的擬合能力。
  • 方差:度量了同樣大小的訓(xùn)練集的變動導(dǎo)致的學(xué)習(xí)性能的變化,刻畫了數(shù)據(jù)擾動所造成的影響。
  • 噪聲:表達(dá)了在當(dāng)前任務(wù)上任何學(xué)習(xí)算法所能達(dá)到的期望泛化誤差的下界。
  • 這樣的表達(dá)可能不太好理解,下面給出了一張圖,幫助一下理解:

    二、L2正則化與權(quán)值衰減

    正則化是一種減小方差的策略,具體可以學(xué)習(xí)吳恩達(dá)老師的機器學(xué)習(xí)的視頻。

    損失函數(shù)衡量模型的輸出與真實標(biāo)簽的差異,正則化使用的地方在目標(biāo)函數(shù),即在原來的代價函數(shù)的基礎(chǔ)上再加上正則化項。

  • L1正則化項:
  • L2正則化項:
    因為在實際使用中L2正則化使用的較多,所以這里重點介紹L2正則化。
  • L2正則化的目標(biāo)函數(shù)如下所示:

    其中正則化項前的系數(shù)lambda/2,lambda調(diào)節(jié)正則化的程度,/2是為了反向傳播求導(dǎo)的時候和平方的2可以約掉。

    在反向傳播進(jìn)行權(quán)值更新時,無正則化項和有正則化項的更新公式如下所示:

    一般lambda是在0到1之間的數(shù),所以從上圖得知,有正則化時更新后的權(quán)值會比無正則化時更小一點,所以一般也將L2正則化稱為權(quán)值衰減(weight decay)。

    下面構(gòu)建了兩個相同的網(wǎng)絡(luò),一個沒有用正則化項,一個使用了正則化項,可以觀察它們各自的擬合效果:

    import torch import torch.nn as nn import matplotlib.pyplot as plt import sys, os from tools.common_tools import set_seed from torch.utils.tensorboard import SummaryWriterset_seed(1) # 設(shè)置隨機種子 n_hidden = 200 # 自定義一個全連接網(wǎng)絡(luò),每層200個神經(jīng)元 max_iter = 2000 # 最大迭代次數(shù)2000次 disp_interval = 200 # 繪圖的epoch間隔 lr_init = 0.01 # 初始化學(xué)習(xí)率# ============================ step 1/5 數(shù)據(jù) ============================ # 構(gòu)造一批虛擬的數(shù)據(jù) def gen_data(num_data=10, x_range=(-1, 1)):w = 1.5train_x = torch.linspace(*x_range, num_data).unsqueeze_(1)train_y = w*train_x + torch.normal(0, 0.5, size=train_x.size())test_x = torch.linspace(*x_range, num_data).unsqueeze_(1)test_y = w*test_x + torch.normal(0, 0.3, size=test_x.size())return train_x, train_y, test_x, test_ytrain_x, train_y, test_x, test_y = gen_data(x_range=(-1, 1))# ============================ step 2/5 模型 ============================ class MLP(nn.Module):def __init__(self, neural_num):super(MLP, self).__init__()self.linears = nn.Sequential(nn.Linear(1, neural_num),nn.ReLU(inplace=True),nn.Linear(neural_num, neural_num),nn.ReLU(inplace=True),nn.Linear(neural_num, neural_num),nn.ReLU(inplace=True),nn.Linear(neural_num, 1),)def forward(self, x):return self.linears(x)# 實例化兩個上面構(gòu)建的全連接網(wǎng)絡(luò),用于比較 net_normal = MLP(neural_num=n_hidden) net_weight_decay = MLP(neural_num=n_hidden)# ============================ step 3/5 優(yōu)化器 ============================ # net_normal 無正則化,net_weight_decay 有正則化,系數(shù)為1e-2 optim_normal = torch.optim.SGD(net_normal.parameters(), lr=lr_init, momentum=0.9) optim_wdecay = torch.optim.SGD(net_weight_decay.parameters(), lr=lr_init, momentum=0.9, weight_decay=1e-2)# ============================ step 4/5 損失函數(shù) ============================ loss_func = torch.nn.MSELoss()# ============================ step 5/5 迭代訓(xùn)練 ============================ writer = SummaryWriter(comment='_test_tensorboard', filename_suffix="12345678")for epoch in range(max_iter):# forwardpred_normal, pred_wdecay = net_normal(train_x), net_weight_decay(train_x)loss_normal, loss_wdecay = loss_func(pred_normal, train_y), loss_func(pred_wdecay, train_y)optim_normal.zero_grad()optim_wdecay.zero_grad()loss_normal.backward()loss_wdecay.backward()optim_normal.step()optim_wdecay.step()if (epoch+1) % disp_interval == 0:# 可視化for name, layer in net_normal.named_parameters():writer.add_histogram(name + '_grad_normal', layer.grad, epoch)writer.add_histogram(name + '_data_normal', layer, epoch)for name, layer in net_weight_decay.named_parameters():writer.add_histogram(name + '_grad_weight_decay', layer.grad, epoch)writer.add_histogram(name + '_data_weight_decay', layer, epoch)test_pred_normal, test_pred_wdecay = net_normal(test_x), net_weight_decay(test_x)# 繪圖plt.scatter(train_x.data.numpy(), train_y.data.numpy(), c='blue', s=50, alpha=0.3, label='train')plt.scatter(test_x.data.numpy(), test_y.data.numpy(), c='red', s=50, alpha=0.3, label='test')plt.plot(test_x.data.numpy(), test_pred_normal.data.numpy(), 'r-', lw=3, label='no weight decay')plt.plot(test_x.data.numpy(), test_pred_wdecay.data.numpy(), 'b--', lw=3, label='weight decay')plt.text(-0.25, -1.5, 'no weight decay loss={:.6f}'.format(loss_normal.item()), fontdict={'size': 15, 'color': 'red'})plt.text(-0.25, -2, 'weight decay loss={:.6f}'.format(loss_wdecay.item()), fontdict={'size': 15, 'color': 'red'})plt.ylim((-2.5, 2.5))plt.legend(loc='upper left')plt.title("Epoch: {}".format(epoch+1))plt.show()plt.close()

    最終的擬合效果:

    紅色的線顯然已經(jīng)過擬合了,而藍(lán)色的線加了正則化項,比紅色的線的效果好一點,這就是L2正則化項緩解過擬合的一個舉例。

    因為在代碼中使用了TensorBoard可視化每一網(wǎng)絡(luò)層的權(quán)重,可以看一下有無正則化兩種情況下權(quán)值分布的差異:

    可以看出不加正則化時,權(quán)值是比較分散的,而且存在較大的值,加入正則化之后,權(quán)值的分布都集中在較小值的范圍,不存在較大的權(quán)值,這也是減輕過擬合的體現(xiàn)。

    三、正則化之Dropout

    Dropout的概念發(fā)揚光大于AlexNet之中,簡單來說就是對網(wǎng)絡(luò)中的每個神經(jīng)元進(jìn)行隨機失活。

    • 隨機:有一個失活概率Dropout probability。
    • 失活:該神經(jīng)元對應(yīng)的權(quán)值為0,即該神經(jīng)元不與其他神經(jīng)元連接。

    如下圖所示就是一次隨機失活的情況:

    訓(xùn)練過程的每個epoch得到的失活后的網(wǎng)絡(luò)都不一樣,這樣使得模型具有多樣性,不會特別依賴某些固定的神經(jīng)元,不會使得某些神經(jīng)元的權(quán)重過大,緩解了過擬合的問題。

    注意:Dropout是在訓(xùn)練過程進(jìn)行隨機失活,在測試的時候是恢復(fù)為原來的網(wǎng)絡(luò)結(jié)構(gòu)的,所以測試的時候,要將所有的權(quán)重乘以1-Dropout probability,以保持輸入與權(quán)值相乘的結(jié)果與訓(xùn)練時一樣大。

    下面我們看一下在PyTorch中Dropout的實現(xiàn):

    torch.nn.Dropout(p: float = 0.5, inplace: bool = False)

    參數(shù)如下:

    主要就是一個失活概率p,默認(rèn)為0.5。

    然后需要注意的是,PyTorch在實現(xiàn)Dropout的時候,訓(xùn)練時權(quán)重均乘以了1/(1-p),即除以1-p,這樣的話測試的時候就不用手動將所有的權(quán)重乘以1-Dropout probability了,方便了測試的過程。

    用上面L2正則化的代碼示例稍加修改作為Dropout的舉例:

    import torch import torch.nn as nn import matplotlib.pyplot as plt import sys, os from tools.common_tools import set_seed from torch.utils.tensorboard import SummaryWriterset_seed(1) # 設(shè)置隨機種子 n_hidden = 200 max_iter = 2000 disp_interval = 400 lr_init = 0.01# ============================ step 1/5 數(shù)據(jù) ============================ def gen_data(num_data=10, x_range=(-1, 1)):w = 1.5train_x = torch.linspace(*x_range, num_data).unsqueeze_(1)train_y = w*train_x + torch.normal(0, 0.5, size=train_x.size())test_x = torch.linspace(*x_range, num_data).unsqueeze_(1)test_y = w*test_x + torch.normal(0, 0.3, size=test_x.size())return train_x, train_y, test_x, test_ytrain_x, train_y, test_x, test_y = gen_data(x_range=(-1, 1))# ============================ step 2/5 模型 ============================ class MLP(nn.Module):def __init__(self, neural_num, d_prob=0.5):super(MLP, self).__init__()self.linears = nn.Sequential(nn.Linear(1, neural_num),nn.ReLU(inplace=True),nn.Dropout(d_prob),nn.Linear(neural_num, neural_num),nn.ReLU(inplace=True),nn.Dropout(d_prob),nn.Linear(neural_num, neural_num),nn.ReLU(inplace=True),nn.Dropout(d_prob),nn.Linear(neural_num, 1),)def forward(self, x):return self.linears(x)net_prob_0 = MLP(neural_num=n_hidden, d_prob=0.) net_prob_05 = MLP(neural_num=n_hidden, d_prob=0.5)# ============================ step 3/5 優(yōu)化器 ============================ optim_normal = torch.optim.SGD(net_prob_0.parameters(), lr=lr_init, momentum=0.9) optim_reglar = torch.optim.SGD(net_prob_05.parameters(), lr=lr_init, momentum=0.9)# ============================ step 4/5 損失函數(shù) ============================ loss_func = torch.nn.MSELoss()# ============================ step 5/5 迭代訓(xùn)練 ============================writer = SummaryWriter(comment='_test_tensorboard', filename_suffix="12345678") for epoch in range(max_iter):pred_normal, pred_wdecay = net_prob_0(train_x), net_prob_05(train_x)loss_normal, loss_wdecay = loss_func(pred_normal, train_y), loss_func(pred_wdecay, train_y)optim_normal.zero_grad()optim_reglar.zero_grad()loss_normal.backward()loss_wdecay.backward()optim_normal.step()optim_reglar.step()if (epoch+1) % disp_interval == 0:net_prob_0.eval()net_prob_05.eval()# 可視化for name, layer in net_prob_0.named_parameters():writer.add_histogram(name + '_grad_normal', layer.grad, epoch)writer.add_histogram(name + '_data_normal', layer, epoch)for name, layer in net_prob_05.named_parameters():writer.add_histogram(name + '_grad_regularization', layer.grad, epoch)writer.add_histogram(name + '_data_regularization', layer, epoch)test_pred_prob_0, test_pred_prob_05 = net_prob_0(test_x), net_prob_05(test_x)# 繪圖plt.clf()plt.scatter(train_x.data.numpy(), train_y.data.numpy(), c='blue', s=50, alpha=0.3, label='train')plt.scatter(test_x.data.numpy(), test_y.data.numpy(), c='red', s=50, alpha=0.3, label='test')plt.plot(test_x.data.numpy(), test_pred_prob_0.data.numpy(), 'r-', lw=3, label='d_prob_0')plt.plot(test_x.data.numpy(), test_pred_prob_05.data.numpy(), 'b--', lw=3, label='d_prob_05')plt.text(-0.25, -1.5, 'd_prob_0 loss={:.8f}'.format(loss_normal.item()), fontdict={'size': 15, 'color': 'red'})plt.text(-0.25, -2, 'd_prob_05 loss={:.6f}'.format(loss_wdecay.item()), fontdict={'size': 15, 'color': 'red'})plt.ylim((-2.5, 2.5))plt.legend(loc='upper left')plt.title("Epoch: {}".format(epoch+1))plt.show()plt.close()net_prob_0.train()net_prob_05.train()

    做的修改就是網(wǎng)絡(luò)模型里加入了Dropout層,刪去了L2正則化項,然后實例化了兩個模型,一個失活概率為0,即等效為不加Dropout層,一個失活概率為0.5,即加入Dropout層,將這兩個模型進(jìn)行數(shù)據(jù)擬合,觀察結(jié)果如下:

    也可以看出,Dropout層的加入也一定程度上緩解了過擬合。

    同樣,我們也來看一下這時的權(quán)值分布,因為第一層是輸入層,沒有加Dropout層,所以我們看第三層的權(quán)值分布(第二層為ReLU層):

    也有類似的作用——收縮權(quán)重。

    補充:

    在使用Dropout層,以及后面要講的BN層這些東西時,還有一個需要注意的小細(xì)節(jié),因為這些層在訓(xùn)練模式和測試模式是有差別的,所以在不同時刻需要切換模式,用到的就是上面代碼中的

    net_prob_0.eval() net_prob_05.eval()

    以及:

    net_prob_0.train() net_prob_05.train()

    總結(jié)

    以上是生活随笔為你收集整理的PyTorch框架学习十六——正则化与Dropout的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人免费毛片视频 | 自拍偷拍国产 | 国产一区二区在 | 欧美一区二区三区久久 | 一区二视频 | 欧美影视| 成人精品一区二区三区四区 | 欧美亚洲伦理 | 久久久久久天堂 | 台湾男男gay做爽爽的视频 | 日本成人免费观看 | www.好吊色 | 在线观看国产成人 | 国产精品日本一区二区在线播放 | 久久久久97国产 | 亚洲国产精品视频一区二区 | 91免费看大片 | 蜜臀av性久久久久蜜臀av麻豆 | 啪啪短视频 | 色诱久久av | 高潮白浆女日韩av免费看 | 久爱视频在线观看 | 国产免费黄色大片 | 精品国产一区二区三区久久久蜜臀 | 狠狠躁日日躁夜夜躁2022麻豆 | 久久高清av| 日韩黄色成人 | 香港一级淫片免费放 | 超碰日日干 | 精品一区二区三区四区五区六区 | 乱lun合集小可的奶水 | 亚洲日本香蕉视频 | 一级片网址 | 成人国产精品免费观看视频 | 国产精品无码一区二区三区免费 | 亚洲色图欧美激情 | 国产高清在线免费观看 | 国产视频福利在线 | 国产又粗又黄的视频 | 欧美日韩性生活视频 | 久草网站 | 亚洲精品人妻无码 | 午夜激情福利视频 | 蜜桃精品视频在线 | 日韩精品第一 | 国产精品丝袜在线 | 超碰日韩 | 三级精品在线观看 | 在线观看jizz | 亚洲在线免费观看 | 免费成人黄 | 5a毛片| 最近中文字幕mv免费高清在线 | 欧美操操 | 五月亚洲婷婷 | 六月丁香激情 | 女女h百合无遮涩涩漫画软件 | 亚洲高清精品视频 | 国产亚洲精品美女久久久久 | 久久精品国产99精品国产亚洲性色 | wwwxxxx国产| 97超碰福利| 清纯粉嫩极品夜夜嗨av | 欧美日色| 亚洲成a人片在线www | 午夜小视频在线播放 | 久久久久一区二区 | 日韩高清黄色 | 日本在线免费播放 | 久久精品视频免费 | 国精品人妻无码一区二区三区喝尿 | 欧美激情 一区 | 国产日本欧美在线观看 | 国产真实的和子乱拍在线观看 | 人碰人人 | 国产日本在线观看 | 米奇7777狠狠狠狠视频 | 超碰97av在线 | 黄视频网站在线 | 成人欧美一区二区三区黑人免费 | 日韩在线视频免费观看 | 91亚洲精品乱码久久久久久蜜桃 | 精品视频免费观看 | 天堂网av在线 | 狠狠人妻久久久久久综合 | 日韩精品国产精品 | 娇小6一8小毛片 | 国产一区二区波多野结衣 | 人人干人人干人人干 | 天堂资源| 国产主播99 | 亚洲一区二区自偷自拍 | 特黄级 | 国内自拍小视频 | 中文字幕亚洲欧美日韩在线不卡 | 交做爰xxxⅹ性爽 | 亚洲国产精品麻豆 | 国产第一草草影院 | 国产精品日本一区二区在线播放 |