PyTorch 第十六彈 hook技術

2021-09-08 13:55:46 字數 3522 閱讀 5444

由於pytorch會自動捨棄圖計算的中間結果,所以想要獲取這些數值就需要使用鉤子函式。

鉤子函式包括variable的鉤子和nn.module鉤子,用法相似。

import torch

from torch.autograd import variable

grad_list =

def print_grad(grad):

x = variable(torch.randn(2, 1), requires_grad=true)

y = x+2

z = torch.mean(torch.pow(y, 2))

lr = 1e-3

y.register_hook(print_grad)

z.backward()

x.data -= lr*x.grad.data

print(grad_list)

[variable containing:

1.5653

3.5175

[torch.floattensor of size 2x1]

]

這兩個函式的功能類似於variable函式的register_hook,可在module前向傳播或反向傳播時註冊鉤子。

每次前向傳播執行結束後會執行鉤子函式(hook)。前向傳播的鉤子函式具有如下形式:hook(module, input, output) -> none,而反向傳播則具有如下形式:hook(module, grad_input, grad_output) -> tensor or none

model = vgg()

features = t.tensor() def hook(module, input, output): '''把這層的輸出拷貝到features中''' features.copy_(output.data) handle = model.layer8.register_forward_hook(hook) _ = model(input) # 用完hook後刪除 handle.remove()

import torch as t

import torch.nn as nn

import torch.nn.functional as f

class lenet(nn.module):

def __init__(self):

super(lenet,self).__init__()

self.conv1 = nn.conv2d(1, 6, 5)

self.conv2 = nn.conv2d(6,16,5)

self.fc1 = nn.linear(16*5*5,120)

self.fc2 = nn.linear(120,84)

self.fc3 = nn.linear(84,10)

def forward(self,x):

x = f.max_pool2d(f.relu(self.conv1(x)),(2,2))

x = f.max_pool2d(f.relu(self.conv2(x)),2)

x = x.view(x.size()[0], -1)

x = f.relu(self.fc1(x))

x = f.relu(self.fc2(x))

x = self.fc3(x)

return x

先模擬一下單次的向前傳播,

net = lenet()

img = t.autograd.variable((t.arange(32*32*1).view(1,1,32,32)))

net(img)

variable containing:

columns 0 to 7

27.6373 -13.4590 23.0988 -16.4491 -8.8454 -15.6934 -4.8512 1.3490

columns 8 to 9

3.7801 -15.9396

[torch.floattensor of size 1x10]

仿照上面示意,進行鉤子註冊,獲取第一卷積層輸出結果,

def hook(module, inputdata, output):

'''把這層的輸出拷貝到features中'''

print(output.data)

handle = net.conv2.register_forward_hook(hook)

net(img)

# 用完hook後刪除

handle.remove()

[torch.floattensor of size 1x16x10x10]

import torch

from torch import nn

import torch.functional as f

from torch.autograd import variable

def for_hook(module, input, output):

print(module)

for val in input:

print("input val:",val)

for out_val in output:

print("output val:", out_val)

class model(nn.module):

def __init__(self):

super(model, self).__init__()

def forward(self, x):

return x+1

model = model()

x = variable(torch.floattensor([1]), requires_grad=true)

handle = model.register_forward_hook(for_hook)

print(model(x))

handle.remove()

可見對於目標層,其輸入輸出都可以獲取到,

model(

)input val: variable containing:

1[torch.floattensor of size 1]

output val: variable containing:

2[torch.floattensor of size 1]

variable containing:

2[torch.floattensor of size 1]

第十六單元

possess v 擁有 to possess highter authority 擁有更高權威 possessive adj 佔有慾強的 own v 擁有 adj 自己的 ownership n 所有權 boast v 吹噓,誇口 boastful adj 自吹自擂的 occupy v 居住 占用...

第十六周 OJ Money Problem

問題及 檔名稱 mian.cpp 作 者 李楠 完成日期 2014年12月15日 版 本 號 v1.0 問題描述 周一小明要乘坐計程車外出,已知,計程車收費標準為不超過3km的部分收8元,超過3km的部分每增加1km加收1元 不足1km按1km計算 那麼,現在請同學們幫小明算出他坐車共需要花多少錢吧...

第十六周計畫

想一想,接下來的一周事情有很多,列個計畫吧。1 周一之前務必完成物聯網課程的ppt 2 周一之前務必寫完2000字的學習總結 3 每天堅持做兩篇六級真題的英語閱讀,準備六級考試,一般是在當天的晚上完成 4 周二開始學習android的專案 5 每天晚上抽時間讀5頁機器學習這本書 6 周一導師可能要開...