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]