1. 程式人生 > >PyTorch學習總結(五)——torch.nn

PyTorch學習總結(五)——torch.nn

這裡寫圖片描述

Parameters

class torch.nn.Parameter()

Variable的一種,常被用於模組引數(module parameter)。

Parameters 是 Variable 的子類。Paramenters和Modules一起使用的時候會有一些特殊的屬性,即:當Paramenters賦值給Module的屬性的時候,他會自動的被加到 Module的 引數列表中(即:會出現在 parameters() 迭代器中)。將Varibale賦值給Module屬性則不會有這樣的影響。 這樣做的原因是:我們有時候會需要快取一些臨時的狀態(state), 比如:模型中RNN的最後一個隱狀態。如果沒有Parameter這個類的話,那麼這些臨時變數也會註冊成為模型變數。

Variable 與 Parameter的另一個不同之處在於,Parameter不能被 volatile(即:無法設定volatile=True)而且預設requires_grad=True。Variable預設requires_grad=False。

Containers

class torch.nn.Module

add_module(name, module)

將一個 child module 新增到當前 modle。 被新增的module可以通過 name屬性來獲取。 例:

import torch.nn as nn
class Model(nn.Module):
def __init__(self): super(Model, self).__init__() self.add_module("conv", nn.Conv2d(10, 20, 4)) #self.conv = nn.Conv2d(10, 20, 4) is the same as above model = Model() print(model.conv)

輸出:

Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))

children()

Returns an iterator over immediate children modules. 返回當前模型 子模組的迭代器。

import torch.nn as nn
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.add_module("conv", nn.Conv2d(10, 20, 4))
        self.add_module("conv1", nn.Conv2d(20 ,10, 4))
model = Model()

for sub_module in model.children():
    print(sub_module)
Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))
Conv2d(20, 10, kernel_size=(4, 4), stride=(1, 1))

eval()

將模型設定成evaluation模式

僅僅當模型中有Dropout和BatchNorm是才會有影響。

load_state_dict(state_dict)

將state_dict中的parameters和buffers複製到此module和它的後代中。state_dict中的key必須和 model.state_dict()返回的key一致。 NOTE:用來載入模型引數。

modules()

返回一個包含 當前模型 所有模組的迭代器。

import torch.nn as nn
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.add_module("conv", nn.Conv2d(10, 20, 4))
        self.add_module("conv1", nn.Conv2d(20 ,10, 4))
model = Model()

for module in model.modules():
    print(module)
Model (
  (conv): Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))
  (conv1): Conv2d(20, 10, kernel_size=(4, 4), stride=(1, 1))
)
Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))
Conv2d(20, 10, kernel_size=(4, 4), stride=(1, 1))

可以看出,modules()返回的iterator不止包含 子模組。這是和children()的不同。

重複的模組只被返回一次(children()也是)。 在下面的例子中, submodule 只會被返回一次:

import torch.nn as nn

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        submodule = nn.Conv2d(10, 20, 4)
        self.add_module("conv", submodule)
        self.add_module("conv1", submodule)
model = Model()

for module in model.modules():
    print(module)
print("fenge")    
for module in model.children():
    print(module)

print(len(list(model.children())))
Model (
  (conv): Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))
  (conv1): Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))
)
Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))
fenge
Conv2d(10, 20, kernel_size=(4, 4), stride=(1, 1))
1

named_children()

返回 包含 模型當前子模組 的迭代器,yield 模組名字和模組本身。

例子:

for name, module in model.named_children():
    if name in ['conv', 'conv1']:
        print(module)

重複的模組由於只能呼叫一次,所以我們輸出不了conv1。

named_modules(memo=None, prefix=”)

返回包含網路中所有模組的迭代器, yielding 模組名和模組本身。

parameters(memo=None)

返回一個 包含模型所有引數 的迭代器。

一般用來當作optimizer的引數。

例子:

for param in model.parameters():
    print(type(param.data), param.size())

<class 'torch.FloatTensor'> (20L,)
<class 'torch.FloatTensor'> (20L, 1L, 5L, 5L)

Pooling Layers

nn.FractionalMaxPool2d(2, output_ratio=(0.5, 0.5))只接受輸入為4D的tensor
nn.FractionalMaxPool2d(3, output_size=(13, 12))可以接受3D輸入

Padding Layers

只接受4D或5D的輸入

Sparse layers

想檢視embedding的內容,可以用以下方式:

embedding = nn.Embedding(10, 3)
print(embedding.weight)
Parameter containing:
-0.0010 -1.4765 -0.6978
-0.4030  1.1792 -0.0820
 1.0888 -0.3538 -0.2297
-1.1154 -0.3636 -0.2577
-0.3030  1.1560 -0.7921
-1.5605 -0.3990 -0.7551
 0.3265 -0.2672 -0.8583
-0.8346  0.5437  0.6192
 0.1881  2.0915  0.5066
 1.9426  0.0619  0.6486
[torch.FloatTensor of size 10x3]
input = Variable(torch.LongTensor([[1,2,4,5],[4,3,2,9]]))
print(embedding(input))
Variable containing:
(0 ,.,.) = 
 -0.4030  1.1792 -0.0820
  1.0888 -0.3538 -0.2297
 -0.3030  1.1560 -0.7921
 -1.5605 -0.3990 -0.7551

(1 ,.,.) = 
 -0.3030  1.1560 -0.7921
 -1.1154 -0.3636 -0.2577
  1.0888 -0.3538 -0.2297
  1.9426  0.0619  0.6486
[torch.FloatTensor of size 2x4x3]