淺談pytorch中的BN層的注意事項(xiàng)
最近修改一個(gè)代碼的時(shí)候,當(dāng)使用網(wǎng)絡(luò)進(jìn)行推理的時(shí)候,發(fā)現(xiàn)每次更改測(cè)試集的batch size大小竟然會(huì)導(dǎo)致推理結(jié)果不同,甚至產(chǎn)生錯(cuò)誤結(jié)果,后來(lái)發(fā)現(xiàn)在網(wǎng)絡(luò)中定義了BN層,BN層在訓(xùn)練過(guò)程中,會(huì)將一個(gè)Batch的中的數(shù)據(jù)轉(zhuǎn)變成正太分布,在推理過(guò)程中使用訓(xùn)練過(guò)程中的參數(shù)對(duì)數(shù)據(jù)進(jìn)行處理,然而網(wǎng)絡(luò)并不知道你是在訓(xùn)練還是測(cè)試階段,因此,需要手動(dòng)的加上,需要在測(cè)試和訓(xùn)練階段使用如下函數(shù)。
model.train() or model.eval()
BN類(lèi)的定義見(jiàn)pytorch中文參考文檔
補(bǔ)充知識(shí):關(guān)于pytorch中BN層(具體實(shí)現(xiàn))的一些小細(xì)節(jié)
最近在做目標(biāo)檢測(cè),需要把訓(xùn)好的模型放到嵌入式設(shè)備上跑前向,因此得把各種層的實(shí)現(xiàn)都用C手?jǐn)]一遍,,,此為背景。
其他層沒(méi)什么好說(shuō)的,但是BN層這有個(gè)小坑。pytorch在打印網(wǎng)絡(luò)參數(shù)的時(shí)候,只打出weight和bias這兩個(gè)參數(shù)。咦,說(shuō)好的BN層有四個(gè)參數(shù)running_mean、running_var 、gamma 、beta的呢?一開(kāi)始我以為是pytorch把BN層的計(jì)算簡(jiǎn)化成weight * X + bias,但馬上反應(yīng)過(guò)來(lái)應(yīng)該沒(méi)這么簡(jiǎn)單,因?yàn)閜ytorch中只有可學(xué)習(xí)的參數(shù)才稱(chēng)為parameter。上網(wǎng)找了一些資料但都沒(méi)有說(shuō)到這么細(xì)的,畢竟大部分用戶(hù)使用時(shí)只要模型能跑起來(lái)就行了,,,于是開(kāi)始看BN層有哪些屬性,果然發(fā)現(xiàn)了熟悉的running_mean和running_var,原來(lái)pytorch的BN層實(shí)現(xiàn)并沒(méi)有不同。這里吐個(gè)槽:為啥要把gamma和beta改叫weight、bias啊,很有迷惑性的好不好,,,
扯了這么多,干脆捋一遍pytorch里BN層的具體實(shí)現(xiàn)過(guò)程,幫自己理清思路,也可以給大家提供參考。再吐槽一下,在網(wǎng)上搜“pytorch bn層”出來(lái)的全是關(guān)于這一層怎么用的、初始化時(shí)要輸入哪些參數(shù),沒(méi)找到一個(gè)pytorch中BN層是怎么實(shí)現(xiàn)的,,,
眾所周知,BN層的輸出Y與輸入X之間的關(guān)系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不贅言。其中g(shù)amma、beta為可學(xué)習(xí)參數(shù)(在pytorch中分別改叫weight和bias),訓(xùn)練時(shí)通過(guò)反向傳播更新;而running_mean、running_var則是在前向時(shí)先由X計(jì)算出mean和var,再由mean和var以動(dòng)量momentum來(lái)更新running_mean和running_var。所以在訓(xùn)練階段,running_mean和running_var在每次前向時(shí)更新一次;在測(cè)試階段,則通過(guò)net.eval()固定該BN層的running_mean和running_var,此時(shí)這兩個(gè)值即為訓(xùn)練階段最后一次前向時(shí)確定的值,并在整個(gè)測(cè)試階段保持不變。
以上這篇淺談pytorch中的BN層的注意事項(xiàng)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Django如何實(shí)現(xiàn)網(wǎng)站注冊(cè)用戶(hù)郵箱驗(yàn)證功能
這篇文章主要介紹了Django如何實(shí)現(xiàn)網(wǎng)站注冊(cè)用戶(hù)郵箱驗(yàn)證功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)將DNA序列存儲(chǔ)為tfr文件并讀取流程介紹
為什么要在實(shí)驗(yàn)過(guò)程中存儲(chǔ)文件,因?yàn)橛行┧惴ǖ膬?nèi)容存在一些重復(fù)計(jì)算的步驟,這些步驟往往消耗很大一部分時(shí)間,在有大量參數(shù)的情況時(shí),需要在多次不同參數(shù)的情況下重復(fù)試驗(yàn),因此可以考慮將一些不涉及參數(shù)運(yùn)算的部分結(jié)果存入文件中2022-09-09Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解
這篇文章主要為大家介紹了Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11python對(duì)html代碼進(jìn)行escape編碼的方法
這篇文章主要介紹了python對(duì)html代碼進(jìn)行escape編碼的方法,涉及Python中escape方法的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05Python使用apscheduler模塊設(shè)置定時(shí)任務(wù)的實(shí)現(xiàn)
本文主要介紹了Python使用apscheduler模塊設(shè)置定時(shí)任務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Python實(shí)現(xiàn)簡(jiǎn)單線(xiàn)性插值去馬賽克算法代碼示例
去馬賽克是圖像處理中的一項(xiàng)技術(shù),用于從單色彩濾光片陣列(CFA)圖像恢復(fù)全彩圖像,本文介紹了一種基于簡(jiǎn)單線(xiàn)性插值的去馬賽克算法,并展示了如何將MATLAB代碼轉(zhuǎn)換為Python代碼,需要的朋友可以參考下2024-10-10python plotly畫(huà)柱狀圖代碼實(shí)例
這篇文章主要介紹了python plotly畫(huà)柱狀圖代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12