卷积层输出形状为何不随通道数相乘?附PyTorch代码疑问
卷积层输出形状与卷积核尺寸疑问解答
代码片段
# 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)
问题解答
1. 第二层卷积输出为什么不是141432*64?
你的理解存在偏差,卷积层不是“每个输入通道单独用卷积核处理后相乘”。对于nn.Conv2d(in_channels=32, out_channels=64):
- 每个输出通道对应一个覆盖所有输入通道的完整卷积核,而非给每个输入通道分配独立核。
- 假设第二层输入是池化后的141432特征图,每个输出通道的计算逻辑是:用一个5532的卷积核,与输入对应区域做逐通道点积后求和,最终得到14*14的单通道特征图。
- 64个输出通道对应64个这样的5532卷积核,所以最终输出是141464,而非141432*64。
2. 为什么卷积核尺寸是5532而不是代码里写的5*5?
代码里的kernel_size=5指的是卷积核在空间维度(高、宽)的尺寸为5x5,而卷积核的通道数必须和输入通道数一致(即32)。完整的卷积核形状为(out_channels, in_channels, kernel_size, kernel_size),对应第二层就是(64, 32, 5, 5),单个输出通道对应的核就是(32,5,5),也就是你听到的5532。
内容的提问来源于stack exchange,提问作者Mike Hua
相关产品推荐
相关产品推荐

