Normalization layers

介紹

歸一化層裆熙,主要有這幾種方法枫攀,BatchNorm(2015年)、LayerNorm(2016年)囊咏、InstanceNorm(2016年)恕洲、GroupNorm(2018年);
將輸入的圖像shape記為[N,C,H,W]梅割,這幾個方法主要區(qū)別是:

  • BatchNorm:batch方向做歸一化霜第,計算NHW的均值,對小batchsize效果不好户辞;(BN主要缺點是對batchsize的大小比較敏感泌类,由于每次計算均值和方差是在一個batch上,所以如果batchsize太小底燎,則計算的均值刃榨、方差不足以代表整個數(shù)據(jù)分布)

  • LayerNorm:channel方向做歸一化,計算CHW的均值双仍;(對RNN作用明顯)

  • InstanceNorm:一個batch枢希,一個channel內(nèi)做歸一化。計算HW的均值朱沃,用在風(fēng)格化遷移苞轿;(因為在圖像風(fēng)格化中,生成結(jié)果主要依賴于某個圖像實例为流,所以對整個batch歸一化不適合圖像風(fēng)格化中呕屎,因而對HW做歸一化【床欤可以加速模型收斂,并且保持每個圖像實例之間的獨立尔当。)

  • GroupNorm:將channel方向分group莲祸,然后每個group內(nèi)做歸一化,算(C//G)HW的均值椭迎;這樣與batchsize無關(guān)锐帜,不受其約束。

Normalization layers

1. BatchNorm詳解

torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm3d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

參數(shù):

num_features:輸入的特征數(shù)畜号,該期望輸入的大小為’N x C [x L]’
eps: 為保證數(shù)值穩(wěn)定性(分母不能趨近或取0),給分母加上的值缴阎。默認(rèn)為1e-5。
momentum: 動態(tài)均值和動態(tài)方差所使用的動量简软。默認(rèn)為0.1蛮拔。
affine: 布爾值述暂,當(dāng)設(shè)為true,給該層添加可學(xué)習(xí)的仿射變換參數(shù)建炫。
track_running_stats:布爾值畦韭,當(dāng)設(shè)為true,記錄訓(xùn)練過程中的均值和方差肛跌;

實現(xiàn)公式:
y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon}}*\gamma+\beta\tag{1.1}

# 示例代碼
import torch
import torch.nn as nn

"""
BatchNorm1d(時域)

Input: (N, C) or (N, C, L)
Output: (N, C) or (N, C, L)(same shape as input)
"""
# input = torch.randn(2, 10, 100)
input = torch.randn(2, 10)
# with learnable parameters
m1 = nn.BatchNorm1d(10)
# without learnable parameters
m2 = nn.BatchNorm1d(10, affine=False)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

"""
BatchNorm2d(空域)

Input: (N, C, H, W)
Output: (N, C, H, W)(same shape as input)
"""
input = torch.randn(2, 10, 35, 45)
# with learnable parameters
m1 = nn.BatchNorm2d(10)
# without learnable parameters
m2 = nn.BatchNorm2d(10)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

"""
BatchNorm3d(時空域)

Input: (N, C, D, H, W)
Output: (N, C, D, H, W)(same shape as input)
"""
input = torch.randn(2, 10, 20, 35, 45)
# with leanable parameters
m1 = nn.BatchNorm3d(10)
# without learnable parameters
m2 = nn.BatchNorm3d(10)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

# 結(jié)果
torch.Size([2, 10])
torch.Size([2, 10])
torch.Size([2, 10, 35, 45])
torch.Size([2, 10, 35, 45])
torch.Size([2, 10, 20, 35, 45])
torch.Size([2, 10, 20, 35, 45])

2. GroupNorm詳解

torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)

參數(shù):

num_groups:需要劃分的groups
num_features:輸入的特征數(shù)艺配,輸入的大小為’N x C x *’
eps: 為保證數(shù)值穩(wěn)定性(分母不能趨近或取0),給分母加上的值。默認(rèn)為1e-5
momentum: 動態(tài)均值和動態(tài)方差所使用的動量衍慎。默認(rèn)為0.1
affine: 布爾值转唉,當(dāng)設(shè)為true,給該層添加可學(xué)習(xí)的仿射變換參數(shù)

實現(xiàn)公式:
y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon}}*\gamma+\beta\tag{2.1}

# 示例代碼
"""
GroupNorm

Input: (N, C, *)where C=num_channels
Output: (N, C, *)(same shape as input)
"""
input = torch.randn(2, 6, 10, 10)
# separate 6 channels into 3 groups
m1 = nn.GroupNorm(3, 6)
# Separate 6 channels into 6 groups (equivalent with InstanceNorm)
m2 = nn.GroupNorm(6, 6)
# Put all 6 channels into a single group (equivalent with LayerNorm)
m3 = nn.GroupNorm(1, 6)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

output3 = m3(input)
print(output3.shape)

# 結(jié)果
torch.Size([2, 6, 10, 10])
torch.Size([2, 6, 10, 10])
torch.Size([2, 6, 10, 10])

3. InstanceNorm詳解

torch.nn.InstanceNorm1d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm3d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)

參數(shù):

num_features:輸入的特征數(shù)稳捆,輸入的大小為’N x C [x L]’
eps:為保證數(shù)值穩(wěn)定性(分母不能趨近或取0),給分母加上的值赠法。默認(rèn)為1e-5
momentum: 動態(tài)均值和動態(tài)方差所使用的動量。默認(rèn)為0.1
affine: 布爾值眷柔,當(dāng)設(shè)為true期虾,給該層添加可學(xué)習(xí)的仿射變換參數(shù)
track_running_stats:布爾值,當(dāng)設(shè)為true驯嘱,記錄訓(xùn)練過程中的均值和方差镶苞;

實現(xiàn)公式:
y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon}}*\gamma+\beta\tag{3.1}

# 示例代碼
"""
InstanceNorm1d

Input: (N, C, L)
Output: (N, C, L)(same shape as input)
"""
input = torch.randn(20, 100, 40)
# without learnable parameters
m1 = nn.InstanceNorm1d(100)
# with learnable parameters
m2 = nn.InstanceNorm1d(100, affine=True)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

"""
InstanceNorm2d

Input: (N, C, H, W)
Output: (N, C, H, W)(same shape as input)
"""
input = torch.randn(20, 100, 35, 45)
# without learnable parameters
m1 = nn.InstanceNorm2d(100)
# with learnable parameters
m2 = nn.InstanceNorm2d(100, affine=True)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

"""
InstanceNorm3d

Input: (N, C, D, H, W)
Output: (N, C, D, H, W)(same shape as input)
"""
input = torch.randn(20, 100, 35, 45)
# without learnable parameters
m1 = nn.InstanceNorm2d(100)
# with learnable parameters
m2 = nn.InstanceNorm2d(100, affine=True)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

# 結(jié)果
torch.Size([20, 100, 40])
torch.Size([20, 100, 40])
torch.Size([20, 100, 35, 45])
torch.Size([20, 100, 35, 45])
torch.Size([20, 100, 35, 45])
torch.Size([20, 100, 35, 45])

4. LayerNorm詳解

torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)

參數(shù):

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ù)

實現(xiàn)公式:
y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon}}*\gamma+\beta\tag{4.1}

# 示例代碼
"""
LayerNorm

Input: (N, *)
Output: (N, *)(same shape as input)
"""
input = torch.randn(20, 5, 10, 10)
# with learnable parameters
m1 = nn.LayerNorm(input.size()[1:])
# without learnable parameters
m2 = nn.LayerNorm(input.size()[1:], elementwise_affine=False)
# normalize over last two dimensions
m3 = nn.LayerNorm([10, 10])
# normalize over last dimension of size 10
m4 = nn.LayerNorm(10)

output1 = m1(input)
print(output1.shape)

output2 = m2(input)
print(output2.shape)

output3 = m3(input)
print(output3.shape)

output4 = m4(input)
print(output4.shape)

# 結(jié)果
torch.Size([20, 5, 10, 10])
torch.Size([20, 5, 10, 10])
torch.Size([20, 5, 10, 10])
torch.Size([20, 5, 10, 10])

論文鏈接

  1. BatchNorm
    https://arxiv.org/pdf/1502.03167.pdf
  2. LayerNorm
    https://arxiv.org/pdf/1607.06450v1.pdf
  3. InstanceNorm
    https://arxiv.org/pdf/1607.08022.pdf
  4. GroupNorm
    https://arxiv.org/pdf/1803.08494.pdf
  5. SwitchableNorm
    https://arxiv.org/pdf/1806.10779.pdf
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剃幌,一起剝皮案震驚了整個濱河市聋涨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌负乡,老刑警劉巖牍白,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抖棘,居然都是意外死亡茂腥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門切省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來最岗,“玉大人,你說我怎么就攤上這事朝捆“愣桑” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驯用。 經(jīng)常有香客問我脸秽,道長,這世上最難降的妖魔是什么晨汹? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任豹储,我火速辦了婚禮,結(jié)果婚禮上淘这,老公的妹妹穿的比我還像新娘剥扣。我一直安慰自己,他們只是感情好铝穷,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布钠怯。 她就那樣靜靜地躺著,像睡著了一般曙聂。 火紅的嫁衣襯著肌膚如雪晦炊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天宁脊,我揣著相機(jī)與錄音断国,去河邊找鬼。 笑死榆苞,一個胖子當(dāng)著我的面吹牛稳衬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坐漏,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼薄疚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赊琳?” 一聲冷哼從身側(cè)響起街夭,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躏筏,沒想到半個月后板丽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡趁尼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年檐什,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弱卡。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖住册,靈堂內(nèi)的尸體忽然破棺而出婶博,到底是詐尸還是另有隱情,我是刑警寧澤荧飞,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布凡人,位于F島的核電站名党,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挠轴。R本人自食惡果不足惜传睹,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岸晦。 院中可真熱鬧欧啤,春花似錦、人聲如沸启上。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冈在。三九已至倒慧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間包券,已是汗流浹背纫谅。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留溅固,地道東北人付秕。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像发魄,于是被迫代替她去往敵國和親盹牧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361