参考链接: class torch.nn.ParameterList(parameters=None)
原文及翻译:
ParameterList ParameterList章节
class torch.nn.ParameterList(parameters=None)
类型: class torch.nn.ParameterList(parameters=None)
Holds parameters in a list.
该类型可以以列表的方式持有多个参数.
ParameterList can be indexed like a regular Python list, but parameters it contains
are properly registered, and will be visible by all Module methods.
ParameterList 类型可以像普通Python列表一样进行索引访问,但是所不同的是它所包含的参数将会被
正确地登记注册,并且可以被所有的Module模块方法可见.
Parameters 参数
parameters (iterable, optional) – an iterable of Parameter to add
parameters (可迭代类型, 可选) – 这是由需要添加的参数构成的可迭代对象.
Example: 例子:
class MyModule(nn.Module):
def __init__(self):
super(MyModule, self).__init__()
self.params = nn.ParameterList([nn.Parameter(torch.randn(10, 10)) for i in range(10)])
def forward(self, x):
# ParameterList can act as an iterable, or be indexed using ints
# ParameterList类型的对象可以像可迭代对象一样使用,或者使用整数来进行索引
for i, p in enumerate(self.params):
x = self.params[i // 2].mm(x) + p.mm(x)
return x
append(parameter)
方法: append(parameter)
Appends a given parameter at the end of the list.
向列表的末尾追加一个给定的参数.
Parameters 参数
parameter (nn.Parameter) – parameter to append
parameter (nn.Parameter) – 需要追加的参数
extend(parameters)
方法: extend(parameters)
Appends parameters from a Python iterable to the end of the list.
将一个Python可迭代类型中的参数追加到列表的末尾.
Parameters 参数
parameters (iterable) – iterable of parameters to append
parameters (iterable可迭代类型) – 由需要追加的参数构成的可迭代对象
代码实验展示:
Microsoft Windows [版本 10.0.18363.1316]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\chenxuqi>conda activate ssd4pytorch1_2_0
(ssd4pytorch1_2_0) C:\Users\chenxuqi>python
Python 3.7.7 (default, May 6 2020, 11:45:54) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.manual_seed(seed=20200910)
<torch._C.Generator object at 0x000001FC6AFBD330>
>>> import torch.nn as nn
>>> params = nn.ParameterList([nn.Parameter(torch.randn(10, 10)) for i in range(10)])
>>> params = nn.ParameterList([nn.Parameter(torch.randn(10+i, 10+i)) for i in range(10)])
>>> params[0].shape
torch.Size([10, 10])
>>> params[9].shape
torch.Size([19, 19])
>>> params[10].shape
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\Anaconda3\envs\ssd4pytorch1_2_0\lib\site-packages\torch\nn\modules\container.py", line 377, in __getitem__
idx = self._get_abs_string_index(idx)
File "D:\Anaconda3\envs\ssd4pytorch1_2_0\lib\site-packages\torch\nn\modules\container.py", line 368, in _get_abs_string_index
raise IndexError('index {} is out of range'.format(idx))
IndexError: index 10 is out of range
>>> params[-1].shape
torch.Size([19, 19])
>>> params[-10].shape
torch.Size([10, 10])
>>> params[-11].shape
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\Anaconda3\envs\ssd4pytorch1_2_0\lib\site-packages\torch\nn\modules\container.py", line 377, in __getitem__
idx = self._get_abs_string_index(idx)
File "D:\Anaconda3\envs\ssd4pytorch1_2_0\lib\site-packages\torch\nn\modules\container.py", line 368, in _get_abs_string_index
raise IndexError('index {} is out of range'.format(idx))
IndexError: index -11 is out of range
>>>
>>> len(params)
10
>>> for param in params:
... print(param.shape)
...
torch.Size([10, 10])
torch.Size([11, 11])
torch.Size([12, 12])
torch.Size([13, 13])
torch.Size([14, 14])
torch.Size([15, 15])
torch.Size([16, 16])
torch.Size([17, 17])
torch.Size([18, 18])
torch.Size([19, 19])
>>>
>>> parameter = nn.Parameter(torch.randn(8, 9))
>>> params.append(parameter)
ParameterList(
(0): Parameter containing: [torch.FloatTensor of size 10x10]
(1): Parameter containing: [torch.FloatTensor of size 11x11]
(2): Parameter containing: [torch.FloatTensor of size 12x12]
(3): Parameter containing: [torch.FloatTensor of size 13x13]
(4): Parameter containing: [torch.FloatTensor of size 14x14]
(5): Parameter containing: [torch.FloatTensor of size 15x15]
(6): Parameter containing: [torch.FloatTensor of size 16x16]
(7): Parameter containing: [torch.FloatTensor of size 17x17]
(8): Parameter containing: [torch.FloatTensor of size 18x18]
(9): Parameter containing: [torch.FloatTensor of size 19x19]
(10): Parameter containing: [torch.FloatTensor of size 8x9]
)
>>> params
ParameterList(
(0): Parameter containing: [torch.FloatTensor of size 10x10]
(1): Parameter containing: [torch.FloatTensor of size 11x11]
(2): Parameter containing: [torch.FloatTensor of size 12x12]
(3): Parameter containing: [torch.FloatTensor of size 13x13]
(4): Parameter containing: [torch.FloatTensor of size 14x14]
(5): Parameter containing: [torch.FloatTensor of size 15x15]
(6): Parameter containing: [torch.FloatTensor of size 16x16]
(7): Parameter containing: [torch.FloatTensor of size 17x17]
(8): Parameter containing: [torch.FloatTensor of size 18x18]
(9): Parameter containing: [torch.FloatTensor of size 19x19]
(10): Parameter containing: [torch.FloatTensor of size 8x9]
)
>>> parameters = [nn.Parameter(torch.randn(60+i, 50+i)) for i in range(5)]
>>> parameters
[Parameter containing:
tensor([[-1.4327e+00, 6.8200e-01, 2.5649e-01, ..., 6.6165e-02,
-1.3798e+00, -9.7789e-02],
[-2.8027e-01, -9.4428e-01, 4.5486e-01, ..., 4.1896e-01,
-1.2095e+00, -6.0156e-01],
[ 2.1879e-01, -5.7297e-02, -1.7633e-04, ..., 1.3900e+00,
1.2983e+00, 7.3527e-01],
...,
[ 1.9722e-01, -4.0972e-01, 5.0989e-01, ..., 7.7913e-01,
-6.0865e-02, 8.5107e-01],
[-1.1421e+00, 4.5078e-01, -1.8716e-01, ..., -1.1327e+00,
-1.9919e+00, -5.4727e-01],
[ 5.5285e-01, 4.6205e-01, -1.2802e+00, ..., -7.2663e-01,
1.1187e+00, -4.4182e-01]], requires_grad=True), Parameter containing:
tensor([[-1.7385, 0.0830, 0.5688, ..., -0.9926, -1.5028, -1.2974],
[ 0.4078, 0.5468, 0.8926, ..., -0.2851, -1.4986, -0.2669],
[-0.1923, 0.3213, -0.1558, ..., -0.4635, 0.0168, -0.0310],
...,
[ 0.1969, 0.0648, -0.7281, ..., 0.6067, -1.0499, -0.5244],
[-1.1800, 0.2413, 1.1485, ..., -1.2141, -0.7107, 0.1033],
[ 0.5751, 2.7271, -0.2200, ..., 1.2645, -1.3813, 0.6229]],
requires_grad=True), Parameter containing:
tensor([[-0.2797, -0.6499, -0.5414, ..., -0.6571, -0.2593, -0.5523],
[ 0.6927, -0.9233, 0.4714, ..., 0.2973, -0.5487, -1.1218],
[ 1.3224, -0.7970, -0.6376, ..., -1.1336, 0.3770, 0.7309],
...,
[ 1.8428, -1.4932, 0.3746, ..., -0.0096, -1.3073, -0.6518],
[-0.3864, 0.4540, -0.1361, ..., 0.4061, -0.3249, -0.4137],
[-0.3859, -1.3519, 0.8041, ..., 1.4219, -0.6871, -0.0086]],
requires_grad=True), Parameter containing:
tensor([[-1.9216, -0.6074, -0.1999, ..., 0.9046, 2.1141, -0.7215],
[-0.2360, 0.9330, 0.5236, ..., -0.2035, 0.8055, 0.2836],
[ 1.1689, 0.4541, -0.1447, ..., 0.7066, -1.7364, 0.7813],
...,
[-0.4927, -0.1389, 0.3624, ..., -0.4476, 2.1240, -0.5492],
[-1.9080, -0.0278, -0.5750, ..., -0.5731, -0.5468, -0.3185],
[ 0.1719, 0.8048, -0.5750, ..., 0.1466, 0.9001, -0.5680]],
requires_grad=True), Parameter containing:
tensor([[ 0.0122, 0.7255, -0.0440, ..., -0.5265, -1.1177, -0.5811],
[-0.0897, 0.3565, 0.0930, ..., 0.2524, -0.6974, -0.2267],
[-0.3315, -0.0101, -0.1876, ..., 0.6636, -0.4355, -1.9713],
...,
[-1.0123, -0.2035, -0.7809, ..., 1.2322, -0.0073, -0.7217],
[ 0.1468, 0.0892, 0.0316, ..., -1.4299, -0.5107, -0.9305],
[ 0.0172, 0.1257, -0.2732, ..., -0.6751, -0.1928, -2.0659]],
requires_grad=True)]
>>> params.extend(parameters)
ParameterList(
(0): Parameter containing: [torch.FloatTensor of size 10x10]
(1): Parameter containing: [torch.FloatTensor of size 11x11]
(2): Parameter containing: [torch.FloatTensor of size 12x12]
(3): Parameter containing: [torch.FloatTensor of size 13x13]
(4): Parameter containing: [torch.FloatTensor of size 14x14]
(5): Parameter containing: [torch.FloatTensor of size 15x15]
(6): Parameter containing: [torch.FloatTensor of size 16x16]
(7): Parameter containing: [torch.FloatTensor of size 17x17]
(8): Parameter containing: [torch.FloatTensor of size 18x18]
(9): Parameter containing: [torch.FloatTensor of size 19x19]
(10): Parameter containing: [torch.FloatTensor of size 8x9]
(11): Parameter containing: [torch.FloatTensor of size 60x50]
(12): Parameter containing: [torch.FloatTensor of size 61x51]
(13): Parameter containing: [torch.FloatTensor of size 62x52]
(14): Parameter containing: [torch.FloatTensor of size 63x53]
(15): Parameter containing: [torch.FloatTensor of size 64x54]
)
>>> params
ParameterList(
(0): Parameter containing: [torch.FloatTensor of size 10x10]
(1): Parameter containing: [torch.FloatTensor of size 11x11]
(2): Parameter containing: [torch.FloatTensor of size 12x12]
(3): Parameter containing: [torch.FloatTensor of size 13x13]
(4): Parameter containing: [torch.FloatTensor of size 14x14]
(5): Parameter containing: [torch.FloatTensor of size 15x15]
(6): Parameter containing: [torch.FloatTensor of size 16x16]
(7): Parameter containing: [torch.FloatTensor of size 17x17]
(8): Parameter containing: [torch.FloatTensor of size 18x18]
(9): Parameter containing: [torch.FloatTensor of size 19x19]
(10): Parameter containing: [torch.FloatTensor of size 8x9]
(11): Parameter containing: [torch.FloatTensor of size 60x50]
(12): Parameter containing: [torch.FloatTensor of size 61x51]
(13): Parameter containing: [torch.FloatTensor of size 62x52]
(14): Parameter containing: [torch.FloatTensor of size 63x53]
(15): Parameter containing: [torch.FloatTensor of size 64x54]
)
>>> for param in params:
... print(param.shape)
...
torch.Size([10, 10])
torch.Size([11, 11])
torch.Size([12, 12])
torch.Size([13, 13])
torch.Size([14, 14])
torch.Size([15, 15])
torch.Size([16, 16])
torch.Size([17, 17])
torch.Size([18, 18])
torch.Size([19, 19])
torch.Size([8, 9])
torch.Size([60, 50])
torch.Size([61, 51])
torch.Size([62, 52])
torch.Size([63, 53])
torch.Size([64, 54])
>>>
>>>
>>>
代码实验展示: 由参数构成的普通Python列表不会被正确地注册登记:
import torch
import torch.nn as nn
torch.manual_seed(seed=20200910)
class Model(torch.nn.Module):
def __init__(self):
super(Model,self).__init__()
self.params_ParameterList_in = nn.ParameterList([nn.Parameter(torch.randn(10+i, 10+2*i)) for i in range(10)])
self.params_PythonList_in = [nn.Parameter(torch.randn(80, 80)) for i in range(10)]
def forward(self,x):
pass
print('cuda(GPU)是否可用:',torch.cuda.is_available())
print('torch的版本:',torch.__version__)
model = Model() #.cuda()
print('普通Python列表不会被正确登记注册'.center(100,"-"))
print("打印模型".center(100,"-"))
for name, param in model.named_parameters(prefix='', recurse=True):
print('参数名字是:', name, '参数形状是:', param.shape)
model.params_ParameterList_out = nn.ParameterList([nn.Parameter(torch.randn(50, 50)) for i in range(10)])
model.params_PythonList_out = [nn.Parameter(torch.randn(60, 60)) for i in range(10)]
print('普通Python列表不会被正确登记注册'.center(100,"-"))
print("打印模型".center(100,"-"))
for name, param in model.named_parameters(prefix='', recurse=True):
print('参数名字是:', name, '参数形状是:', param.shape)
控制台输出结果展示:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 833 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\test4cxq> conda activate ssd4pytorch1_2_0
(ssd4pytorch1_2_0) PS C:\Users\chenxuqi\Desktop\News4cxq\test4cxq> & 'D:\Anaconda3\envs\ssd4pytorch1_2_0\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.12.424452561\pythonFiles\lib\python\debugpy\launcher' '53898' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\test4cxq\test2.py'
cuda(GPU)是否可用: True
torch的版本: 1.2.0+cu92
----------------------------------------普通Python列表不会被正确登记注册-----------------------------------------
------------------------------------------------打印模型------------------------------------------------
参数名字是: params_ParameterList_in.0 参数形状是: torch.Size([10, 10])
参数名字是: params_ParameterList_in.1 参数形状是: torch.Size([11, 12])
参数名字是: params_ParameterList_in.2 参数形状是: torch.Size([12, 14])
参数名字是: params_ParameterList_in.3 参数形状是: torch.Size([13, 16])
参数名字是: params_ParameterList_in.4 参数形状是: torch.Size([14, 18])
参数名字是: params_ParameterList_in.5 参数形状是: torch.Size([15, 20])
参数名字是: params_ParameterList_in.6 参数形状是: torch.Size([16, 22])
参数名字是: params_ParameterList_in.7 参数形状是: torch.Size([17, 24])
参数名字是: params_ParameterList_in.8 参数形状是: torch.Size([18, 26])
参数名字是: params_ParameterList_in.9 参数形状是: torch.Size([19, 28])
----------------------------------------普通Python列表不会被正确登记注册-----------------------------------------
------------------------------------------------打印模型------------------------------------------------
参数名字是: params_ParameterList_in.0 参数形状是: torch.Size([10, 10])
参数名字是: params_ParameterList_in.1 参数形状是: torch.Size([11, 12])
参数名字是: params_ParameterList_in.2 参数形状是: torch.Size([12, 14])
参数名字是: params_ParameterList_in.3 参数形状是: torch.Size([13, 16])
参数名字是: params_ParameterList_in.4 参数形状是: torch.Size([14, 18])
参数名字是: params_ParameterList_in.5 参数形状是: torch.Size([15, 20])
参数名字是: params_ParameterList_in.6 参数形状是: torch.Size([16, 22])
参数名字是: params_ParameterList_in.7 参数形状是: torch.Size([17, 24])
参数名字是: params_ParameterList_in.8 参数形状是: torch.Size([18, 26])
参数名字是: params_ParameterList_in.9 参数形状是: torch.Size([19, 28])
参数名字是: params_ParameterList_out.0 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.1 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.2 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.3 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.4 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.5 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.6 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.7 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.8 参数形状是: torch.Size([50, 50])
参数名字是: params_ParameterList_out.9 参数形状是: torch.Size([50, 50])
(ssd4pytorch1_2_0) PS C:\Users\chenxuqi\Desktop\News4cxq\test4cxq>