最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch hook 鉤子函數(shù)的用法

 更新時間:2022年03月23日 09:54:42   作者:ctrl A_ctrl C_ctrl V  
這篇文章主要介紹了pytorch hook 鉤子函數(shù)的用法,Hook 是 PyTorch 中一個十分有用的特性,使用后可以不必改變網(wǎng)絡(luò)輸入輸出的結(jié)構(gòu),方便地獲取、改變網(wǎng)絡(luò)中間層變量的值和梯度,下文詳細(xì)介紹需要的小伙伴可以參考一下

鉤子編程(hooking),也稱作“掛鉤”,是計算機程序設(shè)計術(shù)語,指通過攔截軟件模塊間的函數(shù)調(diào)用、消息傳遞、事件傳遞來修改或擴展操作系統(tǒng)、應(yīng)用程序或其他軟件組件的行為的各種技術(shù)。處理被攔截的函數(shù)調(diào)用、事件、消息的代碼,被稱為鉤子(hook)。

Hook 是 PyTorch 中一個十分有用的特性。利用它,我們可以不必改變網(wǎng)絡(luò)輸入輸出的結(jié)構(gòu),方便地獲取、改變網(wǎng)絡(luò)中間層變量的值和梯度。這個功能被廣泛用于可視化神經(jīng)網(wǎng)絡(luò)中間層的 feature、gradient,從而診斷神經(jīng)網(wǎng)絡(luò)中可能出現(xiàn)的問題,分析網(wǎng)絡(luò)有效性。

本文主要用 hook 函數(shù)輸出網(wǎng)絡(luò)執(zhí)行過程中 forward 和 backward 的執(zhí)行順序,以此找到了bug所在。

用法如下:

# 設(shè)置hook func
def hook_func(name, module):
? ? def hook_function(module, inputs, outputs):
? ? ? ? # 請依據(jù)使用場景自定義函數(shù)
? ? ? ? print(name+' inputs', inputs)
? ? ? ? print(name+' outputs', outputs)
? ? return hook_function

# 注冊正反向hook
for name, module in model.named_modules():
? ? module.register_forward_hook(hook_func('[forward]: '+name, module))
? ? module.register_backward_hook(hook_func('[backward]: '+name, module))

如一個簡單的 MNIST 手寫數(shù)字識別的模型結(jié)構(gòu)如下:

class Net(nn.Module):
? ? def __init__(self):
? ? ? ? super(Net, self).__init__()
? ? ? ? self.conv1 = nn.Conv2d(1, 32, 3, 1)
? ? ? ? self.conv2 = nn.Conv2d(32, 64, 3, 1)
? ? ? ? self.dropout1 = nn.Dropout(0.25)
? ? ? ? self.dropout2 = nn.Dropout(0.5)
? ? ? ? self.fc1 = nn.Linear(9216, 128)
? ? ? ? self.fc2 = nn.Linear(128, 10)

? ? def forward(self, x):
? ? ? ? x = self.conv1(x)
? ? ? ? x = F.relu(x)
? ? ? ? x = self.conv2(x)
? ? ? ? x = F.relu(x)
? ? ? ? x = F.max_pool2d(x, 2)
? ? ? ? x = self.dropout1(x)
? ? ? ? x = torch.flatten(x, 1)
? ? ? ? x = self.fc1(x)
? ? ? ? x = F.relu(x)
? ? ? ? x = self.dropout2(x)
? ? ? ? x = self.fc2(x)
? ? ? ? output = F.log_softmax(x, dim=1)
? ? ? ? return output

打印模型:

Net(
? (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1))
? (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1))
? (dropout1): Dropout(p=0.25, inplace=False)
? (dropout2): Dropout(p=0.5, inplace=False)
? (fc1): Linear(in_features=9216, out_features=128, bias=True)
? (fc2): Linear(in_features=128, out_features=10, bias=True)
)

構(gòu)建hook函數(shù):

# 設(shè)置hook func
def hook_func(name, module):
? ? def hook_function(module, inputs, outputs):
? ? ? ? with open("log_model.txt", 'a+') as f:
? ? ? ? ? ? # 請依據(jù)使用場景自定義函數(shù)
? ? ? ? ? ? f.write(name + ' ? len(inputs): ' + str(len(inputs)) + '\n')
? ? ? ? ? ? f.write(name + ' ? len(outputs): ?' + str(len(outputs)) + '\n')
? ? return hook_function

# 注冊正反向hook
for name, module in model.named_modules():
? ? module.register_forward_hook(hook_func('[forward]: '+name, module))
? ? module.register_backward_hook(hook_func('[backward]: '+name, module))

輸出的前向和反向傳播過程:

[forward]: conv1   len(inputs): 1
[forward]: conv1   len(outputs):  8
[forward]: conv2   len(inputs): 1
[forward]: conv2   len(outputs):  8
[forward]: dropout1   len(inputs): 1
[forward]: dropout1   len(outputs):  8
[forward]: fc1   len(inputs): 1
[forward]: fc1   len(outputs):  8
[forward]: dropout2   len(inputs): 1
[forward]: dropout2   len(outputs):  8
[forward]: fc2   len(inputs): 1
[forward]: fc2   len(outputs):  8
[forward]:    len(inputs): 1
[forward]:    len(outputs):  8
[backward]:    len(inputs): 2
[backward]:    len(outputs):  1
[backward]: fc2   len(inputs): 3
[backward]: fc2   len(outputs):  1
[backward]: dropout2   len(inputs): 1
[backward]: dropout2   len(outputs):  1
[backward]: fc1   len(inputs): 3
[backward]: fc1   len(outputs):  1
[backward]: dropout1   len(inputs): 1
[backward]: dropout1   len(outputs):  1
[backward]: conv2   len(inputs): 2
[backward]: conv2   len(outputs):  1
[backward]: conv1   len(inputs): 2
[backward]: conv1   len(outputs):  1

因為只要模型處于train狀態(tài),hook_func 就會執(zhí)行,導(dǎo)致不斷輸出 [forward] 和 [backward],所以將輸出內(nèi)容建議寫到文件中,而不是 print

到此這篇關(guān)于pytorch hook 鉤子函數(shù)的用法的文章就介紹到這了,更多相關(guān)pytorch hook 鉤子函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 運用Python巧妙處理Word文檔的方法詳解

    運用Python巧妙處理Word文檔的方法詳解

    大家平時在工作與學(xué)習(xí)中都會操作到Word文件格式,特別是很多數(shù)據(jù)的時候,靠人力去識別操作非常容易出錯。今天就帶大家用python來處理Word文件,感興趣的可以了解一下
    2022-05-05
  • python for循環(huán)如何實現(xiàn)控制步長

    python for循環(huán)如何實現(xiàn)控制步長

    這篇文章主要介紹了python for循環(huán)如何實現(xiàn)控制步長,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python多線程經(jīng)典問題之乘客做公交車算法實例

    Python多線程經(jīng)典問題之乘客做公交車算法實例

    這篇文章主要介紹了Python多線程經(jīng)典問題之乘客做公交車算法,簡單描述了乘客坐公交車問題并結(jié)合實例形式分析了Python多線程實現(xiàn)乘客坐公交車算法的相關(guān)技巧,需要的朋友可以參考下
    2017-03-03
  • Python制作簡易注冊登錄系統(tǒng)

    Python制作簡易注冊登錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Python簡易注冊登錄系統(tǒng)的制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Python利用pip安裝tar.gz格式的離線資源包

    Python利用pip安裝tar.gz格式的離線資源包

    這篇文章主要給大家介紹了關(guān)于Python利用pip安裝tar.gz格式的離線資源包的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python多線程使用方法詳細(xì)講解

    Python多線程使用方法詳細(xì)講解

    這篇文章主要介紹了Python中的多線程實例,一個CPU,將時間切成一片一片的,CPU輪轉(zhuǎn)著去處理一件一件的事情,到了規(guī)定的時間片就處理下一件事情,更多的相關(guān)內(nèi)容需要的小伙伴可以參考下面文章詳細(xì)
    2022-10-10
  • Python Requests庫及用法詳解

    Python Requests庫及用法詳解

    Requests庫作為Python中最受歡迎的HTTP庫之一,為開發(fā)人員提供了簡單而強大的方式來發(fā)送HTTP請求和處理響應(yīng),本文將帶領(lǐng)您深入探索Python Requests庫的世界,我們將從基礎(chǔ)知識開始,逐步深入,覆蓋各種高級用法和技巧,感興趣的朋友一起看看吧
    2024-06-06
  • Python讀寫文件方法總結(jié)

    Python讀寫文件方法總結(jié)

    這篇文章主要介紹了Python讀寫文件方法,實例分析了Python讀寫文件常用的方法與使用技巧,需要的朋友可以參考下
    2015-06-06
  • pandas分區(qū)間,算頻率的實例

    pandas分區(qū)間,算頻率的實例

    今天小編就為大家分享一篇pandas分區(qū)間,算頻率的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python控制臺輸出時刷新當(dāng)前行內(nèi)容而不是輸出新行的實現(xiàn)

    Python控制臺輸出時刷新當(dāng)前行內(nèi)容而不是輸出新行的實現(xiàn)

    今天小編就為大家分享一篇Python控制臺輸出時刷新當(dāng)前行內(nèi)容而不是輸出新行的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評論

高台县| 元氏县| 大埔区| 淮阳县| 奇台县| 曲麻莱县| 自治县| 临沭县| 高台县| 公主岭市| 丰县| 昌宁县| 南溪县| 胶州市| 丹棱县| 三穗县| 密云县| 宜兰市| 彰化县| 稻城县| 桃园市| 玉田县| 青海省| 华宁县| 麦盖提县| 泊头市| 夏津县| 罗田县| 益阳市| 连平县| 山西省| 民县| 澄江县| 海门市| 定南县| 阿克苏市| 尖扎县| 垦利县| 综艺| 蕉岭县| 韶关市|