欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytorch LayerNorm參數(shù)的用法及計算過程

 更新時間:2021年05月27日 09:14:33   作者:拿鐵大俠  
這篇文章主要介紹了pytorch LayerNorm參數(shù)的用法及計算過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

說明

LayerNorm中不會像BatchNorm那樣跟蹤統(tǒng)計全局的均值方差,因此train()和eval()對LayerNorm沒有影響。

LayerNorm參數(shù)

torch.nn.LayerNorm(
        normalized_shape: Union[int, List[int], torch.Size],
        eps: float = 1e-05,
        elementwise_affine: bool = True)

normalized_shape

如果傳入整數(shù),比如4,則被看做只有一個整數(shù)的list,此時LayerNorm會對輸入的最后一維進(jìn)行歸一化,這個int值需要和輸入的最后一維一樣大。

假設(shè)此時輸入的數(shù)據(jù)維度是[3, 4],則對3個長度為4的向量求均值方差,得到3個均值和3個方差,分別對這3行進(jìn)行歸一化(每一行的4個數(shù)字都是均值為0,方差為1);LayerNorm中的weight和bias也分別包含4個數(shù)字,重復(fù)使用3次,對每一行進(jìn)行仿射變換(仿射變換即乘以weight中對應(yīng)的數(shù)字后,然后加bias中對應(yīng)的數(shù)字),并會在反向傳播時得到學(xué)習(xí)。

如果輸入的是個list或者torch.Size,比如[3, 4]或torch.Size([3, 4]),則會對網(wǎng)絡(luò)最后的兩維進(jìn)行歸一化,且要求輸入數(shù)據(jù)的最后兩維尺寸也是[3, 4]。

假設(shè)此時輸入的數(shù)據(jù)維度也是[3, 4],首先對這12個數(shù)字求均值和方差,然后歸一化這個12個數(shù)字;weight和bias也分別包含12個數(shù)字,分別對12個歸一化后的數(shù)字進(jìn)行仿射變換(仿射變換即乘以weight中對應(yīng)的數(shù)字后,然后加bias中對應(yīng)的數(shù)字),并會在反向傳播時得到學(xué)習(xí)。

假設(shè)此時輸入的數(shù)據(jù)維度是[N, 3, 4],則對著N個[3,4]做和上述一樣的操作,只是此時做仿射變換時,weight和bias被重復(fù)用了N次。

假設(shè)此時輸入的數(shù)據(jù)維度是[N, T, 3, 4],也是一樣的,維度可以更多。

注意:顯然LayerNorm中weight和bias的shape就是傳入的normalized_shape。

eps

歸一化時加在分母上防止除零。

elementwise_affine

如果設(shè)為False,則LayerNorm層不含有任何可學(xué)習(xí)參數(shù)。

如果設(shè)為True(默認(rèn)是True)則會包含可學(xué)習(xí)參數(shù)weight和bias,用于仿射變換,即對輸入數(shù)據(jù)歸一化到均值0方差1后,乘以weight,即bias。

LayerNorm前向傳播(以normalized_shape為一個int舉例)

1、如下所示輸入數(shù)據(jù)的shape是(3, 4),此時normalized_shape傳入4(輸入維度最后一維的size),則沿著最后一維(沿著最后一維的意思就是對最后一維的數(shù)據(jù)進(jìn)行操作)并用這兩個結(jié)果把batch沿著最后一維歸一化,使其均值為0,方差為1。歸一化公式用到了eps(),即

tensor = torch.FloatTensor([[1, 2, 4, 1],
                            [6, 3, 2, 4],
                            [2, 4, 6, 1]])

[[-0.8165,  0.0000,  1.6330, -0.8165],
 [ 1.5213, -0.5071, -1.1832,  0.1690],
 [-0.6509,  0.3906,  1.4321, -1.1717]]

2、如果elementwise_affine==True,則對歸一化后的batch進(jìn)行仿射變換,即乘以模塊內(nèi)部的weight(初值是[1., 1., 1., 1.])然后加上模塊內(nèi)部的bias(初值是[0., 0., 0., 0.]),這兩個變量會在反向傳播時得到更新。

3、如果elementwise_affine==False,則LayerNorm中不含有weight和bias兩個變量,只做歸一化,不會進(jìn)行仿射變換。

總結(jié)

在使用LayerNorm時,通常只需要指定normalized_shape就可以了。

補(bǔ)充:【Pytorch】F.layer_norm和nn.LayerNorm到底有什么區(qū)別?

背景

最近在做視頻方向,處理的是時序特征,就想著能不能用Batch Normalization來做視頻特征BN層?在網(wǎng)上查閱資料發(fā)現(xiàn),時序特征并不能用Batch Normalization,因?yàn)橐粋€batch中的序列有長有短。

此外,BN 的一個缺點(diǎn)是需要較大的 batchsize 才能合理估訓(xùn)練數(shù)據(jù)的均值和方差,這導(dǎo)致內(nèi)存很可能不夠用,同時它也很難應(yīng)用在訓(xùn)練數(shù)據(jù)長度不同的 RNN 模型上。

Layer Normalization (LN) 的一個優(yōu)勢是不需要批訓(xùn)練,在單條數(shù)據(jù)內(nèi)部就能歸一化。

對于RNN等時序模型,有時候同一個batch內(nèi)部的訓(xùn)練實(shí)例長度不一(不同長度的句子),則不同的時態(tài)下需要保存不同的統(tǒng)計量,無法正確使用BN層,只能使用Layer Normalization。

查閱Layer Normalization(下述LN)后發(fā)現(xiàn),這東西有兩種用法,一個是F.layer_norm,一個是torch.nn.LayerNorm,本文探究他們的區(qū)別。

F.layer_norm

用法

F.layer_norm(x, normalized_shape, self.weight.expand(normalized_shape), self.bias.expand(normalized_shape))

其中:

x是輸入的Tensor

normalized_shape是要?dú)w一化的維度,可以是x的后若干維度

self.weight.expand(normalized_shape),可選參數(shù),自定義的weight

self.bias.expand(normalized_shape),可選參數(shù),自定義的bias

示例

很容易看出來,跟F.normalize基本一樣,沒有可學(xué)習(xí)的參數(shù),或者自定義參數(shù)。具體使用示例如下:

import torch.nn.functional as F
 
input = torch.tensor(a)
y = F.layer_norm(input,(4,))
print(y)
 
#####################輸出################
tensor([[[-0.8095, -1.1224,  1.2966,  0.6354],
         [-1.0215, -0.9661,  0.8387,  1.1488],
         [-0.3047,  1.0412, -1.4978,  0.7613]],
 
        [[ 0.4605,  1.2144, -1.5122, -0.1627],
         [ 1.5676,  0.1340, -1.0471, -0.6545],
         [ 1.5388, -0.3520, -1.2273,  0.0405]]])

添加縮放:

w = torch.tensor([1,1,2,2])
b = torch.tensor([1,1,1,1])
y = F.layer_norm(input,(4,),w,b)
print(y)
 
#########################輸出######################
tensor([[[ 0.1905, -0.1224,  3.5931,  2.2708],
         [-0.0215,  0.0339,  2.6775,  3.2976],
         [ 0.6953,  2.0412, -1.9956,  2.5225]],
 
        [[ 1.4605,  2.2144, -2.0243,  0.6746],
         [ 2.5676,  1.1340, -1.0942, -0.3090],
         [ 2.5388,  0.6480, -1.4546,  1.0810]]])

nn.LayerNorm

用法

torch.nn.LayerNorm(
        normalized_shape: Union[int, List[int], torch.Size],
        eps: float = 1e-05,
        elementwise_affine: bool = True)

normalized_shape: 輸入尺寸, [∗×normalized_shape[0]×normalized_shape[1]×…×normalized_shape[−1]]

eps: 為保證數(shù)值穩(wěn)定性(分母不能趨近或取0),給分母加上的值。默認(rèn)為1e-5。

elementwise_affine: 布爾值,當(dāng)設(shè)為true,給該層添加可學(xué)習(xí)的仿射變換參數(shù)。

示例

elementwise_affine如果設(shè)為False,則LayerNorm層不含有任何可學(xué)習(xí)參數(shù)。

如果設(shè)為True(默認(rèn)是True)則會包含可學(xué)習(xí)參數(shù)weight和bias,用于仿射變換,即對輸入數(shù)據(jù)歸一化到均值0方差1后,乘以weight,即bias。

import torch
input = torch.randn(2,3,2,2)
import torch.nn as nn
#取消仿射變換要寫成
#m = nn.LayerNorm(input.size()[1:], elementwise_affine=False)
m1 = nn.LayerNorm(input.size()[1:])#input.size()[1:]為torch.Size([3, 2, 2])
output1 = m1(input)
#只normalize后兩個維度
m2 = nn.LayerNorm([2,2])
output2 = m2(input)
#只normalize最后一個維度
m3 = nn.LayerNorm(2)
output3 = m3(input)

總結(jié)

F.layer_norm中沒有可學(xué)習(xí)參數(shù),而nn.LayerNorm有可學(xué)習(xí)參數(shù)。當(dāng)elementwise_affine設(shè)為False時,nn.LayerNorm退化為F.layer_norm。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python3解釋器知識點(diǎn)總結(jié)

    Python3解釋器知識點(diǎn)總結(jié)

    在本篇內(nèi)容中小編給大家總結(jié)了關(guān)于Python3解釋器的用法以及相關(guān)知識點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • Python中三種命令行參數(shù)利用方式詳解

    Python中三種命令行參數(shù)利用方式詳解

    Python的命令行參數(shù),提供了很多有用的功能,可以方便調(diào)試和運(yùn)行,這篇文章主要給大家介紹了關(guān)于Python中三種命令行參數(shù)利用方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • python自動化測試用例全對偶組合與全覆蓋組合比較

    python自動化測試用例全對偶組合與全覆蓋組合比較

    這篇文章主要為大家介紹了python自動化測試用例全對偶組合與全覆蓋組合比較,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python算法練習(xí)之兔子產(chǎn)子(斐波那切數(shù)列)

    python算法練習(xí)之兔子產(chǎn)子(斐波那切數(shù)列)

    這篇文章主要給大家介紹python算法練習(xí)兔子產(chǎn)子,文章先進(jìn)行問題描述及分析然后設(shè)計算法最后再得出完整程序,需要的朋友可以參考一下 文章得具體內(nèi)容
    2021-10-10
  • Python如何用字典完成匹配任務(wù)

    Python如何用字典完成匹配任務(wù)

    在生物信息學(xué)領(lǐng)域,經(jīng)常需要根據(jù)基因名稱匹配其對應(yīng)的編號,本文介紹了一種通過字典進(jìn)行基因名稱與編號匹配的方法,首先定義一個空列表存儲對應(yīng)編號,對于字典中不存在的基因名稱,其編號默認(rèn)為0
    2024-09-09
  • Python FTP兩個文件夾間的同步實(shí)例代碼

    Python FTP兩個文件夾間的同步實(shí)例代碼

    本文通過實(shí)例代碼給大家介紹了python ftp兩個文件夾間的同步,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中

    Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中

    這篇文章主要介紹了Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python讀寫docx文件的方法

    Python讀寫docx文件的方法

    今天小編就為大家分享一篇Python讀寫docx文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python 拼接文件路徑的方法

    python 拼接文件路徑的方法

    今天小編就為大家分享一篇python 拼接文件路徑的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10

最新評論