[轉載] PyTorch踩坑指南(1)nn.BatchNorm2d()函數

參考鏈接: input()函數中的漏洞– Python2.x

前言?

最近在研究深度學習中圖像數據處理的細節(jié)宾巍,基于的平臺是PyTorch锡搜。心血來潮栅贴,總結一下汹买,好記性不如爛筆頭。?

Batch Normalization?

對于2015年出現的Batch Normalization1,2018年的文章Group Normalization2在Abstract中總結得言簡意賅,我直接copy過來端仰。?


?Batch Normalization (BN) is a milestone technique in the development of deep learning, enabling various networks to train. However, normalizing along the batch dimension introduces problems — BN’s error increases rapidly when the batch size becomes smaller, caused by inaccurate batch statistics estimation. This limits BN’s usage for training larger models and transferring features to computer vision tasks including detection, segmentation, and video, which require small batches constrained by memory consumption.?


機器學習中,進行模型訓練之前田藐,需對數據做歸一化處理荔烧,使其分布一致。在深度神經網絡訓練過程中汽久,通常一次訓練是一個batch鹤竭,而非全體數據。每個batch具有不同的分布產生了internal covarivate shift問題——在訓練過程中景醇,數據分布會發(fā)生變化臀稚,對下一層網絡的學習帶來困難。Batch Normalization強行將數據拉回到均值為0三痰,方差為1的正太分布上吧寺,一方面使得數據分布一致,另一方面避免梯度消失酒觅。?

結合圖1撮执,說明Batch Normalization的原理。假設在網絡中間經過某些卷積操作之后的輸出的feature maps的尺寸為N×C×W×H舷丹,5為batch size(N)抒钱,3為channel(C),W×H為feature map的寬高颜凯,則Batch Normalization的計算過程如下谋币。??

?圖 1


1.每個batch計算同一通道的均值





? ? ? ? ?μ




? ? ? ? \mu



? ? ?μ,如圖取channel 0症概,即





? ? ? ? ?c



? ? ? ? ?=



? ? ? ? ?0




? ? ? ? c=0



? ? ?c=0(紅色表示)?





? ? ? ? ? μ



? ? ? ? ? =






? ? ? ? ? ? ?∑




? ? ? ? ? ? ? n



? ? ? ? ? ? ? =



? ? ? ? ? ? ? 0





? ? ? ? ? ? ? N



? ? ? ? ? ? ? ?



? ? ? ? ? ? ? 1






? ? ? ? ? ? ?∑




? ? ? ? ? ? ? w



? ? ? ? ? ? ? =



? ? ? ? ? ? ? 0





? ? ? ? ? ? ? W



? ? ? ? ? ? ? ?



? ? ? ? ? ? ? 1






? ? ? ? ? ? ?∑




? ? ? ? ? ? ? h



? ? ? ? ? ? ? =



? ? ? ? ? ? ? 0





? ? ? ? ? ? ? H



? ? ? ? ? ? ? ?



? ? ? ? ? ? ? 1





? ? ? ? ? ? X



? ? ? ? ? ? [



? ? ? ? ? ? n



? ? ? ? ? ? ,



? ? ? ? ? ? c



? ? ? ? ? ? ,



? ? ? ? ? ? w



? ? ? ? ? ? ,



? ? ? ? ? ? h



? ? ? ? ? ? ]





? ? ? ? ? ? N



? ? ? ? ? ? ×



? ? ? ? ? ? W



? ? ? ? ? ? ×



? ? ? ? ? ? H






? ? ? ? ?\mu = \frac{\sum\limits_{n=0}^{N-1}\sum\limits_{w=0}^{W-1} \sum\limits_{h=0}^{H-1} X[n, c, w, h]}{N×W×H}



? ? ? μ=N×W×Hn=0∑N?1?w=0∑W?1?h=0∑H?1?X[n,c,w,h]?2.每個batch計算同一通道的方差






? ? ? ? ? σ



? ? ? ? ? 2





? ? ? ? σ^2



? ? ?σ2?






? ? ? ? ? ?σ



? ? ? ? ? ?2




? ? ? ? ? =






? ? ? ? ? ? ?∑




? ? ? ? ? ? ? n



? ? ? ? ? ? ? =



? ? ? ? ? ? ? 0





? ? ? ? ? ? ? N



? ? ? ? ? ? ? ?



? ? ? ? ? ? ? 1






? ? ? ? ? ? ?∑




? ? ? ? ? ? ? w



? ? ? ? ? ? ? =



? ? ? ? ? ? ? 0





? ? ? ? ? ? ? W



? ? ? ? ? ? ? ?



? ? ? ? ? ? ? 1






? ? ? ? ? ? ?∑




? ? ? ? ? ? ? h



? ? ? ? ? ? ? =



? ? ? ? ? ? ? 0





? ? ? ? ? ? ? H



? ? ? ? ? ? ? ?



? ? ? ? ? ? ? 1





? ? ? ? ? ? (



? ? ? ? ? ? X



? ? ? ? ? ? [



? ? ? ? ? ? n



? ? ? ? ? ? ,



? ? ? ? ? ? c



? ? ? ? ? ? ,



? ? ? ? ? ? w



? ? ? ? ? ? ,



? ? ? ? ? ? h



? ? ? ? ? ? ]



? ? ? ? ? ? ?



? ? ? ? ? ? μ




? ? ? ? ? ? ?)



? ? ? ? ? ? ?2






? ? ? ? ? ? N



? ? ? ? ? ? ×



? ? ? ? ? ? W



? ? ? ? ? ? ×



? ? ? ? ? ? H






? ? ? ? ?σ^2 = \frac{\sum\limits_{n=0}^{N-1}\sum\limits_{w=0}^{W-1} \sum\limits_{h=0}^{H-1} (X[n, c, w, h]-\mu)^2}{N×W×H}



? ? ? σ2=N×W×Hn=0∑N?1?w=0∑W?1?h=0∑H?1?(X[n,c,w,h]?μ)2?3.對當前channel下feature map中每個點





? ? ? ? ?x




? ? ? ? x



? ? ?x蕾额,索引形式





? ? ? ? ?X



? ? ? ? ?[



? ? ? ? ?n



? ? ? ? ?,



? ? ? ? ?c



? ? ? ? ?,



? ? ? ? ?w



? ? ? ? ?,



? ? ? ? ?h



? ? ? ? ?]




? ? ? ? X[n, c, w, h]



? ? ?X[n,c,w,h],做歸一化?






? ? ? ? ? ?x





? ? ? ? ? ? ′





? ? ? ? ? =





? ? ? ? ? ? (



? ? ? ? ? ? x



? ? ? ? ? ? ?



? ? ? ? ? ? μ



? ? ? ? ? ? )







? ? ? ? ? ? ? σ



? ? ? ? ? ? ? 2




? ? ? ? ? ? ?+



? ? ? ? ? ? ??







? ? ? ? ?x^{'}=\frac{(x-\mu)}{\sqrt{σ^2+\epsilon}}



? ? ? x′=σ2+?



? ? ? ? ? ? ? ? ? ? ?(x?μ)?4.增加縮放和平移變量





? ? ? ? ?γ




? ? ? ? \gamma



? ? ?γ和





? ? ? ? ?β




? ? ? ? \beta



? ? ?β(可學習的仿射變換參數)彼城,歸一化后的值?





? ? ? ? ? y



? ? ? ? ? =



? ? ? ? ? γ




? ? ? ? ? ?x





? ? ? ? ? ? ′





? ? ? ? ? +



? ? ? ? ? β




? ? ? ? ?y=\gamma x^{'}+\beta



? ? ? y=γx′+β 簡化公式:?





? ? ? ? ? y



? ? ? ? ? =





? ? ? ? ? ? x



? ? ? ? ? ? ?



? ? ? ? ? ? μ







? ? ? ? ? ? ? σ



? ? ? ? ? ? ? 2




? ? ? ? ? ? ?+



? ? ? ? ? ? ??






? ? ? ? ? γ



? ? ? ? ? +



? ? ? ? ? β




? ? ? ? ?y=\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}\gamma +\beta



? ? ? y=σ2+?



? ? ? ? ? ? ? ? ? ? ?x?μ?γ+β 原文中的算法描述如下诅蝶,? 注:上圖1所示





? ? ? ? ? m




? ? ? ? ?m



? ? ? m就是





? ? ? ? ? N



? ? ? ? ? ?



? ? ? ? ? W



? ? ? ? ? ?



? ? ? ? ? H




? ? ? ? ?N*W*H



? ? ? N?W?H?

PyTorch的nn.BatchNorm2d()函數?

理解了Batch Normalization的過程退个,PyTorch里面的函數就參考其文檔3用就好。 BatchNorm2d()內部的參數如下:?

num_features:一般情況下輸入的數據格式為batch_size * num_features * height * width调炬,即為特征數语盈,channel數eps:分母中添加的一個值,目的是為了計算的穩(wěn)定性缰泡,默認:1e-5momentum:一個用于運行過程中均值和方差的一個估計參數刀荒,默認值為





? ? ? ? ?0.1




? ? ? ? 0.1



? ? ?0.1;







? ? ? ? ? ?x



? ? ? ? ? ?^





? ? ? ? ? ?n



? ? ? ? ? ?e



? ? ? ? ? ?w





? ? ? ? ?=



? ? ? ? ?(



? ? ? ? ?1



? ? ? ? ??



? ? ? ? ?m



? ? ? ? ?o



? ? ? ? ?m



? ? ? ? ?e



? ? ? ? ?n



? ? ? ? ?t



? ? ? ? ?u



? ? ? ? ?m



? ? ? ? ?)



? ? ? ? ?×




? ? ? ? ? x



? ? ? ? ? ^




? ? ? ? ?+



? ? ? ? ?m



? ? ? ? ?o



? ? ? ? ?m



? ? ? ? ?e



? ? ? ? ?n



? ? ? ? ?t



? ? ? ? ?u



? ? ? ? ?m



? ? ? ? ?×




? ? ? ? ? x



? ? ? ? ? t





? ? ? ? \hat{x}_{new} =(1?momentum) × \hat{x} +momentum×x_t



? ? ?x^new?=(1?momentum)×x^+momentum×xt?棘钞,其中






? ? ? ? ? x



? ? ? ? ? ^





? ? ? ? \hat{x}



? ? ?x^是估計值缠借,






? ? ? ? ? x



? ? ? ? ? t





? ? ? ? x_t



? ? ?xt?是新的觀測值affine:當設為true時,給定可以學習的系數矩陣





? ? ? ? ?γ




? ? ? ? \gamma



? ? ?γ和





? ? ? ? ?β




? ? ? ? \beta



? ? ?β?

Show me the codes?

import torch

import torch.nn as nn

def checkBN(debug = False):

? ? # parameters

? ? N = 5 # batch size

? ? C = 3 # channel

? ? W = 2 # width of feature map

? ? H = 2 # height of feature map

? ? # batch normalization layer

? ? BN = nn.BatchNorm2d(C,affine=True) #gamma和beta, 其維度與channel數相同

? ? # input and output

? ? featuremaps = torch.randn(N,C,W,H)

? ? output = BN(featuremaps)

? ? # checkout

? ? ###########################################

? ? if debug:

? ? ? ? print("input feature maps:\n",featuremaps)

? ? ? ? print("normalized feature maps: \n",output)

? ? ###########################################


? ? # manually operation, the first channel

? ? X = featuremaps[:,0,:,:]

? ? firstDimenMean = torch.Tensor.mean(X)

? ? firstDimenVar = torch.Tensor.var(X,False) #Bessel's Correction貝塞爾校正不被使用


? ? BN_one = ((input[0,0,0,0] - firstDimenMean)/(torch.pow(firstDimenVar+BN.eps,0.5) )) * BN.weight[0] + BN.bias[0]

? ? print('+++'*15,'\n','manually operation: ', BN_one)

? ? print('==='*15,'\n','pytorch result: ', output[0,0,0,0])


if __name__=="__main__":

? ? checkBN()


可以看出手算的結果和PyTorch的nn.BatchNorm2d的計算結果一致宜猜。?

+++++++++++++++++++++++++++++++++++++++++++++

?manually operation:? tensor(-0.0327, grad_fn=<AddBackward0>)

=============================================

?pytorch result:? tensor(-0.0327, grad_fn=<SelectBackward>)


貝塞爾校正?

代碼中出現泼返,求方差時是否需要貝塞爾校正,即從樣本方差到總體方差的校正姨拥。 方差公式從符隙,?






? ? ? ? ? σ



? ? ? ? ? 2




? ? ? ? ?=






? ? ? ? ? ? ∑




? ? ? ? ? ? ?i



? ? ? ? ? ? ?=



? ? ? ? ? ? ?0





? ? ? ? ? ? ?N



? ? ? ? ? ? ??



? ? ? ? ? ? ?1





? ? ? ? ? ?(




? ? ? ? ? ? x



? ? ? ? ? ? i




? ? ? ? ? ??



? ? ? ? ? ?m



? ? ? ? ? ?e



? ? ? ? ? ?a



? ? ? ? ? ?n



? ? ? ? ? ?(



? ? ? ? ? ?x



? ? ? ? ? ?)




? ? ? ? ? ? )



? ? ? ? ? ? 2





? ? ? ? ? N





? ? ? ? \sigma^2 = \frac{\sum\limits_{i=0}^{N-1} (x_i-mean(x))^2}{N}



? ? ?σ2=Ni=0∑N?1?(xi??mean(x))2? 變成(基于樣本的總體方差的有偏估計),?






? ? ? ? ? σ



? ? ? ? ? 2




? ? ? ? ?=






? ? ? ? ? ? ∑




? ? ? ? ? ? ?i



? ? ? ? ? ? ?=



? ? ? ? ? ? ?0





? ? ? ? ? ? ?N



? ? ? ? ? ? ??



? ? ? ? ? ? ?1





? ? ? ? ? ?(




? ? ? ? ? ? x



? ? ? ? ? ? i




? ? ? ? ? ??



? ? ? ? ? ?m



? ? ? ? ? ?e



? ? ? ? ? ?a



? ? ? ? ? ?n



? ? ? ? ? ?(



? ? ? ? ? ?x



? ? ? ? ? ?)




? ? ? ? ? ? )



? ? ? ? ? ? 2






? ? ? ? ? ?N



? ? ? ? ? ??



? ? ? ? ? ?1






? ? ? ? \sigma^2 = \frac{\sum\limits_{i=0}^{N-1} (x_i-mean(x))^2}{N-1}



? ? ?σ2=N?1i=0∑N?1?(xi??mean(x))2??

Reference?



?Ioffe, Sergey, and Christian Szegedy. “Batch normalization: Accelerating deep network training by reducing internal covariate shift.” arXiv preprint arXiv:1502.03167 (2015). ?? ?? Wu, Yuxin, and Kaiming He. "Group normalization." Proceedings of the European Conference on Computer Vision (ECCV). 2018. ?? BatchNorm2d ??

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市垫毙,隨后出現的幾起案子霹疫,更是在濱河造成了極大的恐慌,老刑警劉巖综芥,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丽蝎,死亡現場離奇詭異,居然都是意外死亡膀藐,警方通過查閱死者的電腦和手機屠阻,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來额各,“玉大人国觉,你說我怎么就攤上這事∠豪玻” “怎么了麻诀?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長傲醉。 經常有香客問我蝇闭,道長,這世上最難降的妖魔是什么硬毕? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任呻引,我火速辦了婚禮,結果婚禮上吐咳,老公的妹妹穿的比我還像新娘逻悠。我一直安慰自己元践,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布童谒。 她就那樣靜靜地躺著卢厂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惠啄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天任内,我揣著相機與錄音撵渡,去河邊找鬼。 笑死死嗦,一個胖子當著我的面吹牛趋距,可吹牛的內容都是我干的。 我是一名探鬼主播越除,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼节腐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摘盆?” 一聲冷哼從身側響起翼雀,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孩擂,沒想到半個月后狼渊,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡类垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年狈邑,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚤认。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡米苹,死狀恐怖,靈堂內的尸體忽然破棺而出砰琢,到底是詐尸還是另有隱情蘸嘶,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布陪汽,位于F島的核電站亏较,受9級特大地震影響,放射性物質發(fā)生泄漏掩缓。R本人自食惡果不足惜雪情,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望你辣。 院中可真熱鬧巡通,春花似錦尘执、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弥锄,卻和暖如春丧靡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背籽暇。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工温治, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戒悠。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓熬荆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绸狐。 傳聞我的和親對象是個殘疾皇子卤恳,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容