由於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函式的[variable containing:1.5653
3.5175
[torch.floattensor of size 2x1]
]
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 周一導師可能要開...