为什么我得到的每个通道的计算填充输入大小小于内核大小?

Vik*_*ter 0 python conv-neural-network pytorch

我有以下模型,但它返回错误。不知道为什么。我尝试过谷歌搜索,但到目前为止还没有找到任何东西。我的输入是 6 x 6 的 numpy 数组。

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 16, kernel_size=(3,3), stride=1, padding=0)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=(3,3), stride=1, padding=0)
        self.conv3 = nn.Conv2d(32, 64, kernel_size=(3,3), stride=1, padding=0)

        self.fc1 = nn.Linear(64*4*4, 320)
        self.fc2 = nn.Linear(320, 160)
        self.out = nn.Linear(160, 2)


    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = F.max_pool2d(x, kernel_size=2, stride=2)

        x = self.conv2(x)
        x = F.relu(x)
        x = F.max_pool2d(x, kernel_size=2, stride=2)

        x = self.conv3(x)
        x = F.relu(x)
        x = F.max_pool2d(x, kernel_size=2, stride=2)

        x = x.reshape(-1, 64*4*4)
        #x = torch.flatten(x)

        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.out(x)
        return F.softmax(x, dim=1)
Run Code Online (Sandbox Code Playgroud)

我的输入是 6x6 numpy 数组,出现以下错误,知道为什么吗?

RuntimeError: Calculated padded input size per channel: (2 x 2). Kernel size: (3 x 3). Kernel size can't be greater than actual input size
Run Code Online (Sandbox Code Playgroud)

Szy*_*zke 5

每次与内核大小进行卷积时,3图像大小都会1在每个维度上缩小。

因此,在第一个卷积之后,没有任何填充,您将获得4 x 4图像,并且2 x 2在第二个卷积之后。并且大小的内核显然3 x 3无法遍历2 x 2图像,因此您会收到错误。

padding=1如果您不希望代表性缩小,请添加。

Conv2d您可以在 PyTorchs 文档(此处)中查看有关形状如何随参数变化的更多信息,具体请参阅形状部分。