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

