【问题标题】:PyTorch Linear layer input dimension mismatchPyTorch 线性层输入维度不匹配
【发布时间】:2017-11-05 12:36:28
【问题描述】:

将输入数据传递到 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

【问题讨论】:

    标签: python machine-learning deep-learning pytorch


    【解决方案1】:

    在阅读了一些Examples 之后,我找到了解决方案。以下是您如何在不打乱前向/后向传递流程的情况下做到这一点:

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

    【讨论】:

      【解决方案2】:

      一个更通用的解决方案(无论 x 有多少维度都可以)是取除第一个维度之外的所有维度大小的乘积(“批量大小”):

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 2019-10-23
          • 2020-04-27
          • 1970-01-01
          相关资源
          最近更新 更多