PyTorch线性图层输入尺寸不匹配

时间:2017-06-04 17:45:32

标签: python machine-learning deep-learning pytorch

在PyTorch中将输入数据传递给线性(完全连接层)时出现此错误:

matrices expected, got 4D, 2D tensors

我完全理解这个问题,因为输入数据有一个形状(N,C,H,W)(来自Convolutional + MaxPool层),其中:

  • N:数据样本
  • C:数据的渠道
  • H,W:高度和宽度

然而,我期待PyTorch做"重塑"数据形式:

  • [N,D1,... Dn] - > [N,D]其中D = D1 * D2 * .... Dn

我尝试重塑Variable.data,但我已经读过这种方法不推荐,因为渐变会保留以前的形状,而且通常你不应该改变Variable.data形状。

我很确定有一个简单的解决方案与框架一致,但我还没有找到它。

这有一个很好的解决方案吗?

PD:完全连接层的输入大小为C * H * W

3 个答案:

答案 0 :(得分:5)

在阅读了一些Examples之后,我找到了解决方案。 非常简单:首先,我觉得我觉得很愚蠢。

如果你没有他妈的向前/向后传球

,你就是这样做的
(_, C, H, W) = x.data.size()
x = x.view( -1 , C * H * W)

答案 1 :(得分:3)

更通用的解决方案(无论x有多少个尺寸都可以使用)是采用除第一个尺寸(“批量”)以外的所有尺寸尺寸的乘积:

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

答案 2 :(得分:1)

保存批量大小并在展平中推断其他维度是很常见的:

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