【问题标题】:Pass an arbitrary image size to cnn in pytorch在pytorch中将任意图像大小传递给cnn
【发布时间】:2021-03-16 00:23:27
【问题描述】:

我正在尝试在 pytorch 中训练一个 lenet 模型,我的想法是在其中放入任何大小的图像,所以我开始使用 nn.AdaptiveAvgPool2d 但错误来了

mat1 dim 1 必须匹配 mat2 dim 0

这是我的代码

class LeNet5(nn.Module):
  def __init__(self, num_classes=10):
    super(LeNet5, self).__init__()

    self.conv_1 = nn.Conv2d(
        in_channels=1, out_channels=32, kernel_size=5, bias=False
    )
    self.relu_1 = nn.ReLU(inplace=True)
    self.maxpool_1 = nn.MaxPool2d(kernel_size=2, stride=2)
    self.conv_2 = nn.Conv2d(
        in_channels=32, out_channels=256, kernel_size=5, bias=False
    )
    self.relu_2 = nn.ReLU(inplace=True)
    self.maxpool_2 = nn.MaxPool2d(kernel_size=2, stride=2)
    self.avgpool = nn.AdaptiveAvgPool2d(output_size=1)
    self.flatten = nn.Flatten()
    self.fc_1 = nn.Linear(in_features=4096, out_features=120, bias=False)
    self.fc_2 = nn.Linear(in_features=120, out_features=84)
    self.fc_3 = nn.Linear(in_features=84, out_features=num_classes)

  def forward(self, input):
    conv_1_output = self.conv_1(input)
    relu_1_output = self.relu_1(conv_1_output)
    maxpool_1_output = self.maxpool_1(relu_1_output)
    conv_2_output = self.conv_2(maxpool_1_output)
    relu_2_output = self.relu_2(conv_2_output)
    maxpool_2_output = self.maxpool_2(relu_2_output)
    flatten_output = self.flatten((self.avgpool(maxpool_2_output).view(maxpool_2_output.shape[0], -1)))
    fc_1_output = self.fc_1(flatten_output)
    fc_2_output = self.fc_2(fc_1_output)
    fc_3_output = self.fc_3(fc_2_output)

    return fc_3_output

【问题讨论】:

  • 很难从您的代码中看出,但尝试交换:.view(maxpool_2_output.shape[0], -1))).view(-1, maxpool_2_output.shape[0])))
  • 我试过了,它给出了 stack 期望每个张量大小相等,但在条目 0 处得到 [1, 23, 23],在条目 1 处得到 [1, 37, 37]
  • 我已经发布了答案,它会起作用的
  • 我明白了!它与批次数有关,对于这种可变大小图像的情况,它必须是numb_batch = 1,而我使用的是numb_batch = 64
  • 批量大小无关紧要

标签: python pytorch conv-neural-network


【解决方案1】:

如果您阅读了关于 AdaptiveAvgPool2d 的理论,这就是它所说的“我们指定输出大小并且自动选择步幅和内核大小以适应需求”
更多信息here
因此,您的空间维度减少了AdaptiveAvgPool2d,而不是特征图的深度。 因此,空间维度将是 1x1 并且深度仍然是 256 ,使您的 self.fc_1 = nn.Linear(in_features=256, out_features=120, bias=False) 而不是 self.fc_1 = nn.Linear(in_features=4096, out_features=120, bias=False)

【讨论】:

  • 我也必须考虑到这一点,4096 不起作用,但 256 起作用。
猜你喜欢
  • 2021-04-26
  • 2020-08-04
  • 2012-12-04
  • 1970-01-01
  • 2022-12-12
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多