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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Pytorch Document学习笔记

發(fā)布時(shí)間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch Document学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Pytorch Document學(xué)習(xí)筆記

  • Pytorch Document學(xué)習(xí)筆記
    • 1. 網(wǎng)絡(luò)層
      • 1.1 torch.nn.Conv2d
      • 1.2 torch.nn.MaxPool2d / torch.nn.MaxUnpool2d
      • 1.3 torch.nn.ReLU
      • 1.4 torch.nn.BatchNorm2d
    • 2. 優(yōu)化器
      • 2.1 torch.optim.SGD
      • 2.2 torch.optim.Adagrad
      • 2.3 torch.optim.RMSprop
      • 2.4 torch.optim.Adam
    • 3. 損失函數(shù)
      • 3.1 torch.nn.L1Loss
      • 3.2 torch.nn.MSELoss
      • 3.3 torch.nn.CrossEntropyLoss
    • 4. 初始化
      • 4.1 torch.nn.init.uniform
      • 4.2 torch.nn.init.normal
      • 4.3 torch.nn.init.constant
      • 4.4 torch.nn.init.xavier_uniform / torch.nn.init.xavier_normal
      • 4.5 torch.nn.init.kaiming_uniform / torch.nn.init.kaiming_normal

Pytorch Document學(xué)習(xí)筆記

最近花了些時(shí)間補(bǔ)充了Pytorch相關(guān)的知識(shí),正好借著Pytorch的官方文檔補(bǔ)充下深度學(xué)習(xí)的基礎(chǔ)知識(shí),主要是看看Pytorch中封裝有哪些庫函數(shù),搞清楚這些庫函數(shù)后面具體使用的算法,由于面比較廣,可能深度不是很夠

1. 網(wǎng)絡(luò)層

1.1 torch.nn.Conv2d

卷積層的目的主要是提取特征,in_channels和out_channels分別控制著輸入通道和輸出通道的數(shù)量,kerner_size, stride和padding組合控制這卷積后輸出特征層的大小,另外:
dilation為空洞卷積的間隔,在圖像分割領(lǐng)域,在dilation提出來之前,主要通過pooling和up sampling來提高單個(gè)像素的感受野,dilation的主要作用就是在不用pooling的情況下也能夠增大像素的感受野,以達(dá)到更好的分割效果,如下圖所示:

groups為分組卷積,所謂分組卷積就是將32通道的卷積任務(wù)分為兩個(gè)16通道卷積進(jìn)行,主要作用是減少參數(shù)量,因?yàn)闇p少了參數(shù)量,對(duì)于網(wǎng)絡(luò)來說相當(dāng)于進(jìn)行了正則化。
bias為卷積偏置,偏置的存在主要是為兩個(gè)更好地?cái)M合數(shù)據(jù)

1.2 torch.nn.MaxPool2d / torch.nn.MaxUnpool2d

池化層的作用主要是去掉特征中的冗余信息,相當(dāng)于下采樣操作,當(dāng)return_indices設(shè)置為True時(shí),函數(shù)會(huì)輸出最大值的序號(hào),而最大反池化則等同于上采樣,輸入為最大池化操作的輸出以及序號(hào),將非最大值部分設(shè)置為0
pytorch中出來最大池化操作,池化操作還包括AvgPool2d, FractionalMaxPool2d, LPPool2d, AdaptiveMaxPool2d, AdaptiveAvgPool2d

1.3 torch.nn.ReLU

非線性激活層存在的目的是為了讓網(wǎng)絡(luò)對(duì)非線性的數(shù)學(xué)模型具有擬合效果,與其類似的激活函數(shù)還包括ELU, PReLU, LeakyReLU, Threshold, Sigmoid, Tanh等等等等

1.4 torch.nn.BatchNorm2d

批歸一化層相對(duì)來說會(huì)復(fù)雜一些,起主要目的是改變小批量數(shù)據(jù)的分布(均值和方差),批歸一化的位置如果放在激活層之前則是對(duì)節(jié)點(diǎn)的輸出進(jìn)行歸一化,如果放在激活后則是對(duì)下一個(gè)節(jié)點(diǎn)的輸入進(jìn)行歸一化,都是可以的,批歸一化層的公式如下y=x?mean?[x]Var?[x]+??gamma?+beta?y=\frac{x-\operatorname{mean}[x]}{\sqrt{\operatorname{Var}[x]}+\epsilon} * \text { gamma }+\text { beta } y=Var[x]?+?x?mean[x]???gamma?+?beta?其中meanmeanmeanvarvarvar分別為批數(shù)據(jù)的均值和方差,gammagammagammabetabetabeta為可以學(xué)習(xí)的參數(shù),在訓(xùn)練過程中通過反向傳播更新該參數(shù),而在預(yù)測過程中則將該參數(shù)固定,Batch Normalization(BN)超詳細(xì)解析對(duì)批歸一化層進(jìn)行了詳細(xì)的解釋,參考其總結(jié)一下加入批歸一層帶來的好處:

  • 可以使用更大的學(xué)習(xí)率,學(xué)習(xí)過程更加穩(wěn)定
  • 可以將卷積層中的偏置設(shè)置為0,因?yàn)榕鷼w一化過程中會(huì)移除數(shù)據(jù)流中的直流分量
  • 對(duì)初始化權(quán)重不再敏感
  • 抑制了梯度消失同時(shí)具備正則化的效果
  • 2. 優(yōu)化器

    2.1 torch.optim.SGD

    隨機(jī)梯度下降法的定義是隨機(jī)選取批量數(shù)據(jù)中單個(gè)樣本梯度進(jìn)行梯度下降,其優(yōu)勢是算法收斂速度快,但是精度會(huì)有所損失,在實(shí)際應(yīng)用為了權(quán)衡速度和精度,通常我們是批量樣本中隨機(jī)選取小批量樣本進(jìn)行梯度計(jì)算,例如我們隨機(jī)隨機(jī)了mmm個(gè)樣本{x(1),…,x(m)}\left\{x^{(1)}, \ldots, x^{(m)}\right\}{x(1),,x(m)},對(duì)應(yīng)的目標(biāo)為y(i)y^{(i)}y(i),進(jìn)行梯度估計(jì)有g←1m?w∑iL(f(x(i);w),y(i))g \leftarrow \frac{1}{m} \nabla_{w} \sum_{i} L\left(f\left(x^{(i)} ;w \right), y^{(i)}\right)gm1??w?i?L(f(x(i);w),y(i))進(jìn)行權(quán)重更新有w←w+gw \leftarrow w+gww+g隨機(jī)梯度下降法中有如下幾個(gè)參數(shù):
    動(dòng)量因子momentum,在上面例子的基礎(chǔ)上,多了一步速度更新v←αv??gv \leftarrow \alpha v-\epsilon gvαv??g然后在進(jìn)行權(quán)重更新w←w+vw \leftarrow w+vww+v這樣改進(jìn)之后,當(dāng)前時(shí)刻的梯度與歷史時(shí)刻梯度相似時(shí),這種趨勢在當(dāng)前時(shí)刻會(huì)加強(qiáng),如果不同,則當(dāng)前時(shí)刻的梯度方向減弱,由此動(dòng)量因子可以讓那些因?yàn)閷W(xué)習(xí)率太大而來回?cái)[動(dòng)的參數(shù)梯度前后抵消,從而阻止發(fā)散。
    權(quán)重衰減系數(shù)weight_decay,該系數(shù)和L2正則化有關(guān),所謂L2正則化就是在代價(jià)函數(shù)后面再加上一個(gè)正則化項(xiàng)C=C0+λ2n∑ww2C=C_{0}+\frac{\lambda}{2 n} \sum_{w} w^{2} C=C0?+2nλ?w?w2L2正則化的作用主要是的權(quán)重www變小,防止過擬合。我們對(duì)加入L2正則化后的代價(jià)函數(shù)進(jìn)行推導(dǎo)有:?C?w=?C0?w+λnw\frac{\partial C}{\partial w}=\frac{\partial C_{0}}{\partial w}+\frac{\lambda}{n} w ?w?C?=?w?C0??+nλ?w?C?b=?C0?b\frac{\partial C}{\partial b}=\frac{\partial C_{0}}{\partial b}?b?C?=?b?C0??我們發(fā)現(xiàn),L2正則化后對(duì)偏置bbb沒有影響,但是對(duì)于權(quán)重www的更新有影響:KaTeX parse error: Undefined control sequence: \alphaC at position 56: …frac{\partial \?a?l?p?h?a?C?_{0}}{\partial …在不適用L2正則化時(shí),求導(dǎo)結(jié)果中的www之前的系數(shù)是1,而1?ηλn1-\frac{\eta \lambda}{n}1?nηλ?小于1,其效果是減小www,這就是權(quán)重衰減系數(shù)的由來,在he實(shí)際應(yīng)用中,學(xué)習(xí)率衰減通常有線性衰減(間隔固定epoch學(xué)習(xí)率減半)和指數(shù)衰減(間隔固定epoch學(xué)習(xí)率乘以0.9998)兩種。
    Nesterov加速梯度是在動(dòng)量因子的基礎(chǔ)上可以進(jìn)一步加快收斂速度,使得收斂曲線更加穩(wěn)定,經(jīng)典動(dòng)量的公式如下:vt=αvt?1??g(wt?1)v_{t}=\alpha v_{t-1}-\epsilon g\left(w_{t-1}\right) vt?=αvt?1???g(wt?1?)wt=wt?1+vtw_{t}=w_{t-1}+v_{t} wt?=wt?1?+vt?

    而Nesterov加速梯度后的公式如下:wt?1ahead=wt?1+μvt?1w_{t-1}^{a h e a d}=w_{t-1}+\mu v_{t-1} wt?1ahead?=wt?1?+μvt?1?vt=αvt?1??g(wt?1ahead)v_{t}=\alpha v_{t-1}-\epsilon g\left(w_{t-1}^{a h e a d}\right) vt?=αvt?1???g(wt?1ahead?)wt=wt?1+vtw_{t}=w_{t-1}+v_{t} wt?=wt?1?+vt?即Nesterov加速梯度中計(jì)算的梯度是在當(dāng)前權(quán)重加上累計(jì)速度后的梯度

    2.2 torch.optim.Adagrad

    Adagrad算法相對(duì)SGD算法能夠更加有效地收斂,能夠在數(shù)據(jù)分布系數(shù)的場景,更好利用系數(shù)梯度的信息,我們計(jì)算梯度有:g←1m?w∑iL(f(x(i);w),y(i))g \leftarrow \frac{1}{m} \nabla_{\boldsymbol{w}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{w}\right), \boldsymbol{y}^{(i)}\right) gm1??w?i?L(f(x(i);w),y(i))累積平方梯度:r←r+g⊙gr \leftarrow r+g \odot g rr+gg計(jì)算更新Δθ←??δ+r⊙g\Delta \boldsymbol{\theta} \leftarrow-\frac{\epsilon}{\delta+\sqrt{r}} \odot g Δθ?δ+r???g應(yīng)用更新θ←θ+Δθ\theta \leftarrow \theta+\Delta \theta θθ+Δθ通常Adagrad算法一開始是激勵(lì)收斂的,后面慢慢就變成懲罰收斂,這也就導(dǎo)致了會(huì)出現(xiàn)學(xué)習(xí)綠收縮到太小而無法進(jìn)行有效收斂的情況

    2.3 torch.optim.RMSprop

    RMSprop算法與Adagrad算法唯一的不同就在于累積平方梯度的方法不同,其累積平方梯度的方式為:r←ρr+(1?ρ)g⊙gr \leftarrow \rho r+(1-\rho) g \odot g rρr+(1?ρ)gg其實(shí)就是添加了一個(gè)衰減系數(shù)來控制歷史信息獲取多少,在該函數(shù)中同樣可以配置動(dòng)量因子momentum以及權(quán)重衰減系數(shù)weight_decay

    2.4 torch.optim.Adam

    Adam算法全稱為adaptive moment estimation,Adam算法其實(shí)就是momentum和RMSporp的結(jié)合,其通過計(jì)算梯度的一階矩估計(jì)和二階矩估計(jì)而為不同的參數(shù)設(shè)計(jì)獨(dú)立的自適應(yīng)學(xué)習(xí)率,具體算法如下,同樣先估計(jì)梯度:g←1m?w∑iL(f(x(i);w),y(i))\boldsymbol{g} \leftarrow \frac{1}{m} \nabla_{\boldsymbol{w}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{w}\right), \boldsymbol{y}^{(i)}\right) gm1??w?i?L(f(x(i);w),y(i))然后是更新一階矩估計(jì),也就是momenturm項(xiàng):s←ρ1s+(1?ρ1)gs \leftarrow \rho_{1} s+\left(1-\rho_{1}\right) g sρ1?s+(1?ρ1?)g更新二階矩估計(jì),相當(dāng)于二階矩估計(jì):r←ρ2r+(1?ρ2)g⊙gr \leftarrow \rho_{2} r+\left(1-\rho_{2}\right) g \odot g rρ2?r+(1?ρ2?)gg然后分別修正一階矩偏差和二階矩偏差s^←s1?ρ1t\hat{\boldsymbol{s}} \leftarrow \frac{\boldsymbol{s}}{1-\rho_{1}^{t}} s^1?ρ1t?s?r^←r1?ρ2t\hat{\boldsymbol{r}} \leftarrow \frac{\boldsymbol{r}}{1-\rho_{2}^{t}} r^1?ρ2t?r?然后逐元素計(jì)算更新Δθ=??s^r^+δ\Delta \theta=-\epsilon \frac{\hat{\boldsymbol{s}}}{\sqrt{\hat{\boldsymbol{r}}}+\delta} Δθ=??r^?+δs^?最后應(yīng)用更新:θ←θ+Δθ\theta \leftarrow \theta+\Delta \theta θθ+ΔθAdam算法的優(yōu)勢是適合解決大規(guī)模數(shù)據(jù)的參數(shù)優(yōu)化問題,同時(shí)適用于非穩(wěn)態(tài)目標(biāo)

    pytorch中還有的優(yōu)化方法有Adadelta,Adamax,ASGD,LBFGS以及RProp

    3. 損失函數(shù)

    3.1 torch.nn.L1Loss

    計(jì)算輸入xxx和目標(biāo)yyy之間的絕對(duì)值的平均值loss?(x,y)=1/n∑∣xi?yi∣\operatorname{loss}(x, y)=1 / n \sum \mid x_{i}-y_{i}| loss(x,y)=1/nxi??yi?

    3.2 torch.nn.MSELoss

    計(jì)算輸入xxx和目標(biāo)yyy之間的均方誤差loss?(x,y)=1/n∑(xi?yi)2\operatorname{loss}(x, y)=1 / n \sum\left(x_{i}-y_{i}\right)^{2} loss(x,y)=1/n(xi??yi?)2

    3.3 torch.nn.CrossEntropyLoss

    用于多分類器的交叉熵?fù)p失loss?(x,class?)=?log?exp?(x[class?])∑jexp?(x[j]))=?x[class?]+log?(∑jexp?(x[j]))\operatorname{loss}(x, \text { class })=-\log \frac{\exp (x[\text { class }])}{\left.\sum_{j} \exp (x[j])\right)} \quad=-x[\text { class }]+\log \left(\sum_{j} \exp (x[j])\right) loss(x,?class?)=?logj?exp(x[j]))exp(x[?class?])?=?x[?class?]+log(j?exp(x[j]))

    pytorch中還有的損失函數(shù)有NLLLoss,KLDivLoss,BCELoss,MarginRankingLoss,HingeEmbeddingLoss,MultiLabelMarginLoss,SmoothL1Loss,SoftMarginLoss,MultiLabelSoftMarginLOss,CosineEmbeddingLoss,MultiMarginLoss

    4. 初始化

    4.1 torch.nn.init.uniform

    從給定的上下界的均勻分布中生成值,然后填充入張量或者變量進(jìn)行初始化

    4.2 torch.nn.init.normal

    從給定的均值和方差的正態(tài)分布中生成值,然后填充入張量或者變量進(jìn)行初始化

    4.3 torch.nn.init.constant

    將給定的常量填充入張量或者變量進(jìn)行初始化

    4.4 torch.nn.init.xavier_uniform / torch.nn.init.xavier_normal

    為了使得網(wǎng)絡(luò)中信息更好的流動(dòng),每一層輸出的方差應(yīng)該盡量相同,這就是xavier算法的核心思想,對(duì)于一層卷積有
    y=w1x1+?+wnixni+by=w_{1} x_{1}+\cdots+w_{n_{i}} x_{n_{i}}+b y=w1?x1?+?+wni??xni??+b其中nin_ini?表示輸入個(gè)數(shù),根據(jù)概率統(tǒng)計(jì)知識(shí)我們有如下方差公式:Var?(wixi)=E[wi]2Var?(xi)+E[xi]2Var?(wi)+Var?(wi)Var?(xi)\operatorname{Var}\left(w_{i} x_{i}\right)=E\left[w_{i}\right]^{2} \operatorname{Var}\left(x_{i}\right)+E\left[x_{i}\right]^{2} \operatorname{Var}\left(w_{i}\right)+\operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(wi?xi?)=E[wi?]2Var(xi?)+E[xi?]2Var(wi?)+Var(wi?)Var(xi?)特別地,當(dāng)我們假設(shè)輸入和權(quán)重都是0均值時(shí)有Var?(wixi)=Var?(wi)Var?(xi)\operatorname{Var}\left(w_{i} x_{i}\right)=\operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(wi?xi?)=Var(wi?)Var(xi?)進(jìn)一步假設(shè)輸入的xxxwww都是獨(dú)立同分布,則有:Var?(y)=niVar?(wi)Var?(xi)\operatorname{Var}(y)=n_{i} \operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(y)=ni?Var(wi?)Var(xi?)于是,為了保證輸入與輸出方差一致,則應(yīng)該有:Var?(wi)=1ni\operatorname{Var}\left(w_{i}\right)=\frac{1}{n_{i}} Var(wi?)=ni?1?對(duì)于一個(gè)多層網(wǎng)絡(luò),某一層的方差可以用累計(jì)的形式表達(dá):Var?[zi]=Var?[x]∏i′=0i?1ni′Var?[Wi′]\operatorname{Var}\left[z^{i}\right]=\operatorname{Var}[x] \prod_{i^{\prime}=0}^{i-1} n_{i^{\prime}} \operatorname{Var}\left[W^{i^{\prime}}\right] Var[zi]=Var[x]i=0i?1?ni?Var[Wi]反向傳播時(shí)具有類似的形式:Var?[?Cost??si]=Var?[?Cost??sd]∏i′=idni′+1Var?[Wi′]\operatorname{Var}\left[\frac{\partial \text { Cost }}{\partial s^{i}}\right]=\operatorname{Var}\left[\frac{\partial \text { Cost }}{\partial s^ozvdkddzhkzd}\right] \prod_{i^{\prime}=i}^ozvdkddzhkzd n_{i^{\prime}+1} \operatorname{Var}\left[W^{i^{\prime}}\right] Var[?si??Cost??]=Var[?sd??Cost??]i=id?ni+1?Var[Wi]則為了保證前向傳播和反向傳播時(shí)每一層的方差一致,則應(yīng)該滿足?i,niVar?[Wi]=1\forall i, \quad n_{i} \operatorname{Var}\left[W^{i}\right]=1 ?i,ni?Var[Wi]=1?i,ni+1Var?[Wi]=1\forall i, \quad n_{i+1} \operatorname{Var}\left[W^{i}\right]=1 ?i,ni+1?Var[Wi]=1但是實(shí)際中輸入和輸出的個(gè)數(shù)通常不相等,因此最終我們的權(quán)重方差應(yīng)該滿足:?i,Var?[Wi]=2ni+ni+1\forall i, \quad \operatorname{Var}\left[W^{i}\right]=\frac{2}{n_{i}+n_{i+1}} ?i,Var[Wi]=ni?+ni+1?2?對(duì)于[a, b]區(qū)間中的均勻分布的方差為:Var?=(b?a)212\operatorname{Var}=\frac{(b-a)^{2}}{12} Var=12(b?a)2?那么,滿足xavier算法的均勻分布是W~U[?6nj+nj+1,6nj+nj+1]W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}\right] WU[?nj?+nj+1??6??,nj?+nj+1??6??]同理我們可知滿足xavier算法的高斯分布是W~N[0,2nj+nj+1]W\sim N\left[0, \frac{\sqrt{2}}{\sqrt{n_{j}+n_{j+1}}}\right]WN[0,nj?+nj+1??2??]

    4.5 torch.nn.init.kaiming_uniform / torch.nn.init.kaiming_normal

    上述xavier初始化的問題主要在只適用于線性激活函數(shù),但實(shí)際上,對(duì)于深層神經(jīng)網(wǎng)絡(luò)來說,線性激活函數(shù)沒有價(jià)值。kaiming算法就是針對(duì)是非線性的Relu激活函數(shù)設(shè)計(jì)的一種初始化方法。對(duì)于均值為0的輸出來說,Relu激活函數(shù)會(huì)將小于零的部分都置為0,這樣上述xavier初始化中均值為0的假設(shè)就不成立了,具體的推到可以參考論文Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

    pytorch中還有的初始化方式有eye,dirac,sparse

    與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

    總結(jié)

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

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