# First convolutional layer: input channels = 1, output channels = 32, kernel size = 5x5, padding = 2 (SAME)
self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=5, stride=1, padding=2)
# First pooling layer: max pooling, kernel size = 2x2, stride = 2
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
# Second convolutional layer: input channels = 32, output channels = 64, kernel size = 5x5, padding = 2 (SAME)
self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, stride=1, padding=2)
# Second pooling layer: max pooling, kernel size = 2x2, stride = 2
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
问题:为什么第二个卷积层之后的输出不是 14*14*32*64?对于 32 通道输入,每个卷积核在一个通道上运行,产生 64 种不同的结果。 32个通道不应该相乘吗?
我得到的答案如下:对于输入的每个 14 * 14 位置,具有 5532 输入区域的 5532 核点积将为您提供 14*14 单通道输出。内核大小不是5 * 5吗?
假设您的输入形状为
(N, 1, 32, 32)
((N,C,H,W)格式)。
现在,让我们列出每层之后的输出形状。
self.conv1
:(N, 32, 32, 32)
。 5x5x1
形状的 32 个滤波器在填充输入上进行卷积(5x5 是内核大小,1 是输入通道数)。因此,输出有 32 个形状为 32x32
的特征图。
self.pool1
:
(N, 32, 16, 16)
。池化层将特征图下采样 2 倍。
self.conv2
:
(N, 64, 16, 16)
。
5x5x32
形状的 64 个过滤器应用于填充输入(5x5 是内核大小,32 是输入通道数)。用一个滤波器进行卷积运算后的输出形状是
16x16
。因此,该层的输出有 64 个形状为 16x16
的特征图。self.pool2
:
(N, 64, 8, 8)
。池化层将特征图下采样 2 倍。