簡體   English   中英

將任意圖像大小傳遞給 pytorch 中的 cnn

[英]Pass an arbitrary image size to cnn in pytorch

我正在嘗試在 pytorch 中訓練一個 lenet model,想法是將任何大小的圖像放入其中,所以我開始使用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

如果您閱讀有關AdaptiveAvgPool2d的理論,這就是它所說的“我們指定 output 大小並且自動選擇步幅和內核大小以適應需求”
更多信息在這里
因此,您的空間維度由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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM