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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

dropout理解(一)

發(fā)布時(shí)間:2024/9/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dropout理解(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.Dropout原理

1.概述
作用:防止過擬合
方法:訓(xùn)練時(shí),隨機(jī)停止某些神經(jīng)元的參數(shù)訓(xùn)練
2. Dropout工作流程及使用
2.1 Dropout具體工作流程
假設(shè)我們要訓(xùn)練這樣一個(gè)神經(jīng)網(wǎng)絡(luò),如圖2所示。

上圖表示標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)。

輸入是x輸出是y,正常的流程是:我們首先把x通過網(wǎng)絡(luò)前向傳播,然后把誤差反向傳播以決定如何更新參數(shù)讓網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)。使用Dropout之后,過程變成如下:
(1)首先隨機(jī)(臨時(shí))刪掉網(wǎng)絡(luò)中一半的隱藏神經(jīng)元,輸入輸出神經(jīng)元保持不變(圖3中虛線為部分臨時(shí)被刪除的神經(jīng)元)

(2) 然后把輸入x通過修改后的網(wǎng)絡(luò)前向傳播,然后把得到的損失結(jié)果通過修改的網(wǎng)絡(luò)反向傳播。一小批訓(xùn)練樣本執(zhí)行完這個(gè)過程后,在沒有被刪除的神經(jīng)元上按照隨機(jī)梯度下降法更新對應(yīng)的參數(shù)(w,b)。

(3)然后繼續(xù)重復(fù)這一過程:

. 恢復(fù)被刪掉的神經(jīng)元(此時(shí)被刪除的神經(jīng)元保持原樣,而沒有被刪除的神經(jīng)元已經(jīng)有所更新)

. 從隱藏層神經(jīng)元中隨機(jī)選擇一個(gè)一半大小的子集臨時(shí)刪除掉(備份被刪除神經(jīng)元的參數(shù))。

. 對一小批訓(xùn)練樣本,先前向傳播然后反向傳播損失并根據(jù)隨機(jī)梯度下降法更新參數(shù)(w,b) (沒有被刪除的那一部分參數(shù)得到更新,刪除的神經(jīng)元參數(shù)保持被刪除前的結(jié)果)。

Dropout在神經(jīng)網(wǎng)絡(luò)中的使用

Dropout的具體工作流程上面已經(jīng)詳細(xì)的介紹過了,但是具體怎么讓某些神經(jīng)元以一定的概率停止工作(就是被刪除掉)?代碼層面如何實(shí)現(xiàn)呢?

下面,我們具體講解一下Dropout代碼層面的一些公式推導(dǎo)及代碼實(shí)現(xiàn)思路。

(1)在訓(xùn)練模型階段

無可避免的,在訓(xùn)練網(wǎng)絡(luò)的每個(gè)單元都要添加一道概率流程。

圖4:標(biāo)準(zhǔn)網(wǎng)絡(luò)和帶有Dropout網(wǎng)絡(luò)的比較

對應(yīng)的公式變化如下:

. 沒有Dropout的網(wǎng)絡(luò)計(jì)算公式:

. 采用Dropout的網(wǎng)絡(luò)計(jì)算公式:


上面公式中Bernoulli函數(shù)是為了生成概率r向量,也就是隨機(jī)生成一個(gè)0、1的向量。

代碼層面實(shí)現(xiàn)讓某個(gè)神經(jīng)元以概率p停止工作,其實(shí)就是讓它的激活函數(shù)值以概率p變?yōu)?。比如我們某一層網(wǎng)絡(luò)神經(jīng)元的個(gè)數(shù)為1000個(gè),其激活函數(shù)輸出值為y1、y2、y3、…、y1000,我們dropout比率選擇0.4,那么這一層神經(jīng)元經(jīng)過dropout后,1000個(gè)神經(jīng)元中會有大約400個(gè)的值被置為0。

注意: 經(jīng)過上面屏蔽掉某些神經(jīng)元,使其激活值為0以后,我們還需要對向量y1……y1000進(jìn)行縮放,也就是乘以1/(1-p)。如果你在訓(xùn)練的時(shí)候,經(jīng)過置0后,沒有對y1……y1000進(jìn)行縮放(rescale),那么在測試的時(shí)候,就需要對權(quán)重進(jìn)行縮放,操作如下。

在測試模型階段

預(yù)測模型的時(shí)候,每一個(gè)神經(jīng)單元的權(quán)重參數(shù)要乘以概率p。

圖5:預(yù)測模型時(shí)Dropout的操作
測試階段Dropout公式:

3.通過代碼理解

# coding:utf-8 import numpy as np# dropout函數(shù)的實(shí)現(xiàn),函數(shù)中,x是本層網(wǎng)絡(luò)的激活值。Level就是dropout就是每個(gè)神經(jīng)元要被丟棄的概率。 def dropout(x, level):if level < 0. or level >= 1: #level是概率值,必須在0~1之間raise ValueError('Dropout level must be in interval [0, 1[.')retain_prob = 1. - level# 我們通過binomial函數(shù),生成與x一樣的維數(shù)向量。binomial函數(shù)就像拋硬幣一樣,我們可以把每個(gè)神經(jīng)元當(dāng)做拋硬幣一樣# 硬幣 正面的概率為p,n表示每個(gè)神經(jīng)元試驗(yàn)的次數(shù)# 因?yàn)槲覀兠總€(gè)神經(jīng)元只需要拋一次就可以了所以n=1,size參數(shù)是我們有多少個(gè)硬幣。random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即將生成一個(gè)0、1分布的向量,0表示這個(gè)神經(jīng)元被屏蔽,不工作了,也就是dropout了print(random_tensor)x *= random_tensorprint(x)x /= retain_probreturn x#對dropout的測試,大家可以跑一下上面的函數(shù),了解一個(gè)輸入x向量,經(jīng)過dropout的結(jié)果 x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32) print(dropout(x,0.4)) import torch import torch.nn as nn import torch.nn.functional as Fclass LinearFC(nn.Module):def __init__(self):super(LinearFC, self).__init__()self.fc = nn.Linear(3, 2)def forward(self, input):out = self.fc(input)out = F.dropout(out, p=0.5, training=self.training)return outNet = LinearFC() x = torch.randint(10, (2, 3)).float() # 隨機(jī)生成不大于10的整數(shù),轉(zhuǎn)為float, 因?yàn)閚n.linear需要float類型數(shù)據(jù) Net.train() output = Net(x) print(output)# train the Net
  • 第一步Net = LinearFC(),生成WWWbbb:
  • W=tensor([[-0.5347, 0.3559, 0.0637],[-0.5676, -0.0257, 0.1802]], requires_grad=True) b=tensor([0.4141, 0.4688], requires_grad=True)
  • 第二步x = torch.randint(10, (2, 3)).float(),隨機(jī)生成不大于10的整數(shù),轉(zhuǎn)為float, 因?yàn)閚n.linear需要float類型數(shù)據(jù)
  • x=tensor([[3., 2., 0.],[2., 6., 8.]])
  • 第三步 output = Net(x) out = self.fc(input)進(jìn)入forward, out=x×WT+bout = x \times W^T + bout=x×WT+b,代碼實(shí)現(xiàn):torch.mm(x, Net.fc.weight.t()) + Net.fc.bias
  • tensor([[-0.4783, -1.2855],[ 1.9898, 0.6210]], grad_fn=<AddBackward0>)
  • 第四步,dropout,公式out=out/(1?0.5)在以0.5概率置為0out = out/(1-0.5)在以0.5概率置為0out=out/(1?0.5)0.50
  • (torch.mm(x, Net.fc.weight.t()) + Net.fc.bias)/(1-0.5)= tensor([[-0.9565, -2.5710],[ 3.9796, 1.2420]], grad_fn=<DivBackward0>) out= tensor([[-0.0000, -0.0000],[0.0000, 1.2420]], grad_fn=<MulBackward0>)

    可以看到經(jīng)過dropout之后,數(shù)據(jù)變?yōu)?#xff1a;tensor([[-0.0000, -0.0000], [0.0000, 1.2420]], grad_fn=<MulBackward0>)

    轉(zhuǎn)載:https://blog.csdn.net/powu0193/article/details/99573632

    總結(jié)

    以上是生活随笔為你收集整理的dropout理解(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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