Pytorch學習筆記(三)Pytorch的常用操作記錄
阿新 • • 發佈:2019-01-10
檢視Pytorch網路的各層輸出(feature map)、權重、偏置
在使用Pytorch的時候,我總是在想我怎麼看每一層的輸出、權重、偏置,下面記錄我自己的方法,應該是方式多樣,但是我現在的水平沒辦法評價好壞,如果有更好的辦法歡迎留言告知!!!
weight and bias
# Method 1 檢視Parameters的方式多樣化,直接訪問即可
model = alexnet(pretrained=True).to(device)
conv1_weight = model.features[0].weight
# Method 2
# 這種方式還適合你想自己參考一個預訓練模型寫一個網路,各層的引數不變,但網路結構上表述有所不同
# 這樣你就可以把param迭代出來,賦給你的網路對應層,避免直接load不能匹配的問題!
for layer,param in model.state_dict().items(): # param is weight or bias(Tensor)
print layer,param
feature map
由於pytorch是動態網路,不儲存計算資料,檢視各層輸出的特徵圖並不是很方便!分下面兩種情況討論:
- 你想檢視的層是獨立的,那麼你在forward時用變數接收並返回即可!!!
class Net(nn.Module):
def __init__(self):
self. conv1 = nn.Conv2d(1, 1, 3)
self.conv2 = nn.Conv2d(1, 1, 3)
self.conv3 = nn.Conv2d(1, 1, 3)
def forward(self, x):
out1 = F.relu(self.conv1(x))
out2 = F.relu(self.conv2(out1))
out3 = F.relu(self.conv3(out2))
return out1, out2, out3
- 你的想看的層在
nn.Sequential()
# Method 1 巧用nn.Module.children()
# 在模型例項化之後,利用nn.Module.children()刪除你檢視的那層的後面層
import torch
import torch.nn as nn
from torchvision import models
model = models.alexnet(pretrained=True)
# remove last fully-connected layer
new_classifier = nn.Sequential(*list(model.classifier.children())[:-1])
model.classifier = new_classifier
# Third convolutional layer
new_features = nn.Sequential(*list(model.features.children())[:5])
model.features = new_features
# Method 2 巧用hook,推薦使用這種方式,不用改變原有模型
# torch.nn.Module.register_forward_hook(hook)
# hook(module, input, output) -> None
model = models.alexnet(pretrained=True)
# 定義
def hook (module,input,output):
print output.size()
# 註冊
handle = model.features[0].register_forward_hook(hook)
# 刪除控制代碼
handle.remove()
# torch.nn.Module.register_backward_hook(hook)
# hook(module, grad_input, grad_output) -> Tensor or None
model = alexnet(pretrained=True).to(device)
outputs = []
def hook (module,input,output):
outputs.append(output)
print len(outputs)
handle = model.features[0].register_backward_hook(hook)