PyTorch中卷积的输出维度

5
我的输入图像大小为68 x 224 x 3 (高x宽x通道数),第一个Conv2d层定义如下:
conv1 = torch.nn.Conv2d(3, 16, stride=4, kernel_size=(9,9))
请问为什么输出特征体积的大小是16 x 15 x 54?我知道有16个过滤器,所以前面有一个16,但如果使用[(W−K+2P)/S]+1计算尺寸,则尺寸不可被整除。
可以有人解释一下吗?
2个回答

7
特征图的计算公式为[(W−K+2P)/S]+1,其中[]表示向下取整。在您的示例中填充方式是零填充,因此计算如下:[(68-9+2*0)/4]+1 ->[14.75]=14 -> [14.75]+1 = 15[(224-9+2*0)/4]+1 -> [53.75]=53 -> [53.75]+1 = 54
import torch

conv1 = torch.nn.Conv2d(3, 16, stride=4, kernel_size=(9,9))
input = torch.rand(1, 3, 68, 224)

print(conv1(input).shape)
# torch.Size([1, 16, 15, 54])

您可能会看到不同的公式来计算特征图。

PyTorch中: enter image description here

通常,您可能会看到这个:

enter image description here

然而,这两种情况的结果是相同的。


1
只是为了帮助所有想知道这两个公式是如何相同的人节省一些基本的心算:例如,膨胀默认为1,因此当您乘以-1 *(kernel_size-1)时,您将得到(-kernel_size +1),因此+1会与括号外面的1抵消,然后您就会得到下面的公式。 - Samuel Rodríguez

0

在卷积层之后,我遇到了同样的不便,难以估计张量的输出大小。请查看我在https://github.com/tuttelikz/conv_output_size上实现的辅助函数。

示例:

import torch
import torch.nn as nn
from conv_output_size import conv2d_output_size

c_i, c_o = 3, 16
k, s, p = 3, 2, 1

sample_2d_tensor = torch.ones((c_i, 64, 64))
c2d = nn.Conv2d(in_channels=c_i, out_channels=c_o, kernel_size=k,
                stride=s, padding=p)

output_size = conv2d_output_size(
    sample_2d_tensor.shape, out_channels=c_o, kernel_size=k, stride=s, padding=p)

print("After conv2d")
print("Dummy input size:", sample_2d_tensor.shape)
print("Calculated output size:", output_size)
print("Real output size:", c2d(sample_2d_tensor).detach().numpy().shape")

>>> After conv2d
>>> Dummy input size: torch.Size([3, 64, 64])
>>> Calculated output size: (16, 32, 32)
>>> Real output size: (16, 32, 32)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接