【问题标题】:PyTorch - unexpected shape of model parameters weightsPyTorch - 模型参数权重的意外形状
【发布时间】:2020-08-15 08:45:52
【问题描述】:

我在 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?当我显示相应的张量时,显示看起来完全相似,但形状不同。

【问题讨论】:

  • 可以为模型类添加代码吗?

标签: deep-learning neural-network pytorch tensor


【解决方案1】:

在 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())

【讨论】:

  • 谢谢。现在完全有道理。我想转置是为了在反向传播过程中提供帮助
猜你喜欢
  • 2019-04-27
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2019-05-01
  • 2019-02-26
  • 2020-09-09
相关资源
最近更新 更多