PyTorch线性层输入维度不匹配。

3

当我把输入数据传递给PyTorch中的Linear(全连接层)时,出现了以下错误:

matrices expected, got 4D, 2D tensors

我完全理解这个问题,因为输入数据的形状是(N,C,H,W)(来自卷积+最大池化层),其中:
  • N:数据样本
  • C:数据通道
  • H,W:高度和宽度
然而,我期望PyTorch进行数据的“重塑”:
  • [N,D1,...,Dn] --> [N,D],其中D = D1 * D2 * ....Dn
我尝试重塑Variable.data,但我已经读到过这种方法不被推荐,因为梯度会保留先前的形状,并且通常不应该改变Variable.data的形状。
我相信有一个简单的解决方案与框架一起使用,但我还没有找到它。
这个问题有好的解决方案吗?
附言:全连接层的输入大小为C * H * W
3个回答

6

阅读了一些示例后,我找到了解决方法。以下是如何在不混淆前向/后向传递流程的情况下进行操作:

(_, C, H, W) = x.data.size()
x = x.view( -1 , C * H * W)

5

更一般的解决方案(不考虑x有多少个维度)是取除了第一个维度(批次大小)以外的所有维度的尺寸的乘积:

n_features = np.prod(x.size()[1:])
x = x.view(-1, n_features)

1

通常情况下,我们会保存批次大小并在展平操作中推断出其他维度:

batch_size = x.shape[0]
...
x = x.view(batch_size, -1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接