PyTorch - 模型参数权重的意外形状
PyTorch - unexpected shape of model parameters weights
我在 Pytorch 中创建了一个全连接网络,输入层的形状为 (1,784)
,第一个隐藏层的形状为 (1,256)
。
简而言之:nn.Linear(in_features=784, out_features=256, bias=True)
方法 1:model.fc1.weight.data.shape
给我 torch.Size([128, 256])
,而
方法 2:list(model.parameters())[0].shape
给我 torch.Size([256, 784])
事实上,在大小为 784 的输入层和大小为 256 的隐藏层之间,我期待一个形状为 (784,256)
的矩阵。
因此,在第一种情况下,我看到下一个隐藏层 (128) 的形状,这对于输入和第一个隐藏层之间的权重没有意义,在第二种情况下,看起来 Pytorch 进行了变换的权重矩阵。
我不太明白 Pytorch 如何塑造不同的权重矩阵,以及如何在训练后访问各个权重。我应该使用方法 1 还是方法 2?当我显示相应的张量时,显示看起来完全相似,但形状不同。
在 Pytorch 中,模型参数的权重在对输入矩阵应用 matmul
操作之前被 转置 。这就是权重矩阵维度被翻转的原因,并且与您期望的不同;即,您观察到它不是 [784, 256]
,而是 [256, 784]
。
您可以查看 nn.Linear
的 Pytorch 源文档,我们有:
...
self.weight = Parameter(torch.Tensor(out_features, in_features))
...
def forward(self, input):
return F.linear(input, self.weight, self.bias)
查看F.linear
的实现时,我们看到将输入矩阵与权重矩阵的转置相乘的对应行:
output = input.matmul(weight.t())
我在 Pytorch 中创建了一个全连接网络,输入层的形状为 (1,784)
,第一个隐藏层的形状为 (1,256)
。
简而言之:nn.Linear(in_features=784, out_features=256, bias=True)
方法 1:model.fc1.weight.data.shape
给我 torch.Size([128, 256])
,而
方法 2:list(model.parameters())[0].shape
给我 torch.Size([256, 784])
事实上,在大小为 784 的输入层和大小为 256 的隐藏层之间,我期待一个形状为 (784,256)
的矩阵。
因此,在第一种情况下,我看到下一个隐藏层 (128) 的形状,这对于输入和第一个隐藏层之间的权重没有意义,在第二种情况下,看起来 Pytorch 进行了变换的权重矩阵。
我不太明白 Pytorch 如何塑造不同的权重矩阵,以及如何在训练后访问各个权重。我应该使用方法 1 还是方法 2?当我显示相应的张量时,显示看起来完全相似,但形状不同。
在 Pytorch 中,模型参数的权重在对输入矩阵应用 matmul
操作之前被 转置 。这就是权重矩阵维度被翻转的原因,并且与您期望的不同;即,您观察到它不是 [784, 256]
,而是 [256, 784]
。
您可以查看 nn.Linear
的 Pytorch 源文档,我们有:
...
self.weight = Parameter(torch.Tensor(out_features, in_features))
...
def forward(self, input):
return F.linear(input, self.weight, self.bias)
查看F.linear
的实现时,我们看到将输入矩阵与权重矩阵的转置相乘的对应行:
output = input.matmul(weight.t())