可視化pytorch 模型中不同BN層的running mean曲線實(shí)例
加載模型字典
逐一判斷每一層,如果該層是bn 的 running mean,就取出參數(shù)并取平均作為該層的代表
對(duì)保存的每個(gè)BN層的數(shù)值進(jìn)行曲線可視化
from functools import partial import pickle import torch import matplotlib.pyplot as plt pth_path = 'checkpoint.pth' pickle.load = partial(pickle.load, encoding="latin1") pickle.Unpickler = partial(pickle.Unpickler, encoding="latin1") pretrained_dict = torch.load(pth_path, map_location=lambda storage, loc: storage, pickle_module=pickle) pretrained_dict = pretrained_dict['state_dict'] means = [] for name, param in pretrained_dict.items(): print(name) if 'running_mean' in name: means.append(mean.numpy()) layers = [i for i in range(len(means))] plt.plot(layers, means, color='blue') plt.legend() plt.xticks(layers) plt.xlabel('layers') plt.show()
補(bǔ)充知識(shí):關(guān)于pytorch中BN層(具體實(shí)現(xiàn))的一些小細(xì)節(jié)
最近在做目標(biāo)檢測(cè),需要把訓(xùn)好的模型放到嵌入式設(shè)備上跑前向,因此得把各種層的實(shí)現(xiàn)都用C手?jǐn)]一遍,,,此為背景。
其他層沒什么好說的,但是BN層這有個(gè)小坑。pytorch在打印網(wǎng)絡(luò)參數(shù)的時(shí)候,只打出weight和bias這兩個(gè)參數(shù)。咦,說好的BN層有四個(gè)參數(shù)running_mean、running_var 、gamma 、beta的呢?一開始我以為是pytorch把BN層的計(jì)算簡(jiǎn)化成weight * X + bias,但馬上反應(yīng)過來應(yīng)該沒這么簡(jiǎn)單,因?yàn)閜ytorch中只有可學(xué)習(xí)的參數(shù)才稱為parameter。上網(wǎng)找了一些資料但都沒有說到這么細(xì)的,畢竟大部分用戶使用時(shí)只要模型能跑起來就行了,,,于是開始看BN層有哪些屬性,果然發(fā)現(xiàn)了熟悉的running_mean和running_var,原來pytorch的BN層實(shí)現(xiàn)并沒有不同。這里吐個(gè)槽:為啥要把gamma和beta改叫weight、bias啊,很有迷惑性的好不好,,,
扯了這么多,干脆捋一遍pytorch里BN層的具體實(shí)現(xiàn)過程,幫自己理清思路,也可以給大家提供參考。再吐槽一下,在網(wǎng)上搜“pytorch bn層”出來的全是關(guān)于這一層怎么用的、初始化時(shí)要輸入哪些參數(shù),沒找到一個(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í)通過反向傳播更新;而running_mean、running_var則是在前向時(shí)先由X計(jì)算出mean和var,再由mean和var以動(dòng)量momentum來更新running_mean和running_var。所以在訓(xùn)練階段,running_mean和running_var在每次前向時(shí)更新一次;在測(cè)試階段,則通過net.eval()固定該BN層的running_mean和running_var,此時(shí)這兩個(gè)值即為訓(xùn)練階段最后一次前向時(shí)確定的值,并在整個(gè)測(cè)試階段保持不變。
以上這篇可視化pytorch 模型中不同BN層的running mean曲線實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中以函數(shù)作為參數(shù)(回調(diào)函數(shù))的實(shí)現(xiàn)方法
這篇文章主要介紹了python中以函數(shù)作為參數(shù)(回調(diào)函數(shù))的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01python 實(shí)現(xiàn)樸素貝葉斯算法的示例
這篇文章主要介紹了python實(shí)現(xiàn)樸素貝葉斯算法的示例,幫助大家更好的理解和學(xué)習(xí)python 機(jī)器學(xué)習(xí)算法,感興趣的朋友可以了解下2020-09-09在Python中實(shí)現(xiàn)shuffle給列表洗牌
今天小編就為大家分享一篇在Python中實(shí)現(xiàn)shuffle給列表洗牌,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python使用Keras OCR實(shí)現(xiàn)從圖像中刪除文本
這篇文章主要為大家介紹了如何在Python中利用Keras OCR實(shí)現(xiàn)快速地從圖像中刪除文本,從而作為圖像分類器的預(yù)處理步驟,需要的可以參考一下2022-03-03python?random庫(kù)的簡(jiǎn)單使用demo
這篇文章主要為大家介紹了python?random庫(kù)的簡(jiǎn)單使用demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03從入門到精通:玩轉(zhuǎn)Python?Fire庫(kù)
想快速打造屬于你的Python?GUI應(yīng)用嗎?拋開復(fù)雜的代碼,用Python?Fire庫(kù)就能輕松實(shí)現(xiàn)!本指南將引領(lǐng)你從零起步,駕馭Python?Fire的強(qiáng)大功能,讓編程既簡(jiǎn)單又高效,準(zhǔn)備好了嗎?讓我們開始玩轉(zhuǎn)Python?Fire,開啟你的編程冒險(xiǎn)吧!2024-02-02對(duì)PyQt5的輸入對(duì)話框使用(QInputDialog)詳解
今天小編就為大家分享一篇對(duì)PyQt5的輸入對(duì)話框使用(QInputDialog)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06