1. 程式人生 > >Pytorch學習筆記(三)Pytorch的常用操作記錄

Pytorch學習筆記(三)Pytorch的常用操作記錄

檢視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是動態網路,不儲存計算資料,檢視各層輸出的特徵圖並不是很方便!分下面兩種情況討論:

  1. 你想檢視的層是獨立的,那麼你在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
  1. 你的想看的層在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)