卷积和池化计算公式总结

在卷积神经网络(CNN)中,卷积层和池化层是最常见的两种操作层。为了更好地理解网络结构并进行参数计算,下面将详细介绍这两类层的参数个数以及输出特征图大小的计算公式,并通过一个示例加以说明。

一、卷积层

1. 卷积层参数个数公式

假设:

  • 卷积核(Filter)大小为 (\text{KernelHeight} \times \text{KernelWidth})
  • 输入特征图通道数为 (\text{inChannels})
  • 输出特征图通道数为 (\text{outChannels})
  • 偏置(bias)可选,若有偏置则每个输出通道有一个偏置参数。

那么,卷积层参数个数的计算公式为:

[
\text{卷积层参数个数}
= (\text{KernelHeight} \times \text{KernelWidth} \times \text{inChannels} + \text{是否含偏置}) \times \text{outChannels}
]

其中,“是否含偏置”若 bias=True,则在卷积核参数之外再多加一个参数(对应每个输出通道),因此对于每个输出通道都要加 1。

示例

  • 输入通道 inChannels = 3
  • 输出通道 outChannels = 32
  • 卷积核大小 (3 \times 3)
  • 有偏置 bias=True

则有

[
\text{参数个数}
= (3 \times 3 \times 3 + 1) \times 32
= (27 + 1) \times 32
= 28 \times 32
= 896
]

2. 卷积层输出特征图大小公式

对于二维卷积,输入特征图大小为 (\text{inHeight} \times \text{inWidth}),输出特征图大小为 (\text{outHeight} \times \text{outWidth})。
令:

在这里插入图片描述

卷积输出特征图大小计算公式为:

[
\text{outHeight}
= \left\lfloor \frac{\text{inHeight} + 2 \times \text{Padding} - \text{KernelSize}}{\text{Stride}} \right\rfloor + 1
]
[
\text{outWidth}
= \left\lfloor \frac{\text{inWidth} + 2 \times \text{Padding} - \text{KernelSize}}{\text{Stride}} \right\rfloor + 1
]

示例

  • 输入大小为 (224 \times 224)
  • 卷积核大小 (3 \times 3)
  • 填充 Padding = 1
  • 步幅 Stride = 1

则 卷积输出特征图大小计算公式为:
在这里插入图片描述

如果卷积输出通道数为 32,则最终输出特征图大小为
在这里插入图片描述


二、池化层

池化层(如最大池化 MaxPool 或平均池化 AvgPool)一般用于下采样,减少特征图的分辨率,加快模型计算速度并扩大感受野。

1. 池化层输出特征图大小公式

令:

  • (\text{inHeight}, \text{inWidth}) 为输入特征图大小
  • (\text{PoolSize}) 为池化核大小(假设高宽相同,亦可拆分为不同值)
  • (\text{Stride}) 为步幅
  • 假设无填充(Padding=0),若有填充,公式与卷积相同,只是没有卷积核与通道混合计算。

池化层输出特征图大小计算公式为:

[
\text{outHeight}
= \left\lfloor \frac{\text{inHeight} - \text{PoolSize}}{\text{Stride}} \right\rfloor + 1
]
[
\text{outWidth}
= \left\lfloor \frac{\text{inWidth} - \text{PoolSize}}{\text{Stride}} \right\rfloor + 1
]

示例

  • 输入特征图大小 (224 \times 224 )
  • 池化核大小 PoolSize = 2
  • 步幅 Stride = 2
  • 无填充

[
\text{outHeight}
= \frac{224 - 2}{2} + 1
= \frac{222}{2} + 1
= 111 + 1
= 112
]
[
\text{outWidth}
= \text{outHeight} = 112
]

若池化层输入通道数与输出通道数相同(通常如此),则最终池化层输出特征图为
[
112 \times 112 \times \text{原通道数}
]


三、完整示例

以下示例是一个极简网络结构,包括 1 个卷积层和 1 个最大池化层:

import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv = nn.Conv2d(in_channels=3,  # 输入通道数
                              out_channels=32, # 输出通道数
                              kernel_size=3,
                              stride=1,
                              padding=1,
                              bias=True)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)

    def forward(self, x):
        x = self.conv(x)   # 输出尺寸: 224 x 224 x 32
        x = self.pool(x)   # 输出尺寸: 112 x 112 x 32
        return x

# 测试一下输入输出维度
if __name__ == "__main__":
    model = SimpleCNN()
    x = torch.randn(1, 3, 224, 224)  # BatchSize=1, 通道=3, H=224, W=224
    y = model(x)
    print("输出尺寸:", y.shape)  # 结果应为 (1, 32, 112, 112)
    
    # 计算卷积层参数
    total_params = sum(p.numel() for p in model.parameters())
    print("网络参数总数:", total_params)
  1. 卷积层输出特征图大小

    • (224 \rightarrow 224)
      (经填充+卷积操作后分辨率不变)
    • 输出通道数 32
    • 输出特征图大小(\mathbf{224 \times 224 \times 32})
  2. 池化层输出特征图大小

    • (224 \rightarrow 112)(
      2 倍下采样)
    • 输出通道数仍为 32
    • 输出特征图大小(\mathbf{112 \times 112 \times 32})
  3. 卷积层参数个数
    [
(3 \times 3 \times 3 + 1) \times 32 = 896
]


四、常见问题

  1. 为什么要加偏置?
    在大多数情况下,为了让每个输出通道都有单独的可学习偏置参数,通常会设置 bias=True。若网络结构有批归一化(BatchNorm)等层时,有时也可将卷积层的偏置去掉,以避免重复或过度拟合。

  2. 填充的目的是啥?
    填充(Padding)通常可以在卷积操作前对输入的边缘做一定的补零,使输出特征图的尺寸不缩小(或减缓缩小)。在经典网络(如 ResNet)中,我们常使用 padding=1 搭配 kernel_size=3,从而保持输出大小与输入一致。

  3. 池化层与卷积层的通道数为何相同?
    池化层在做下采样时,仅对 空间维度(height, width) 进行缩放,并不改变输入特征图的通道数,所以输出通道数一般保持不变。

  4. 卷积输出特征图大小计算公式中的下取整 (\lfloor \cdot \rfloor) 什么时候会有影响?

    • 当填充、步幅、卷积核大小不匹配输入特征图时,就可能导致下取整导致输出特征图尺寸略小。例如:输入尺寸不是步幅的整数倍时,会发生下取整。
    • 若想精确控制输出尺寸,可以配置合适的 paddingstride

五、总结

在这里插入图片描述

通过这些简单公式,可以迅速计算出卷积层和池化层的输出维度及参数数量。这对设计卷积神经网络和理解其内部结构至关重要,也有助于对模型进行调试、优化和部署。

Tip: 由于官方实现里通常会在计算卷积/池化输出时使用 Floor 运算(向下取整),所以在实际编程或搭建网络的过程中,要格外留意输入大小和步幅、填充之间的匹配关系,才能得到期望的输出尺寸。


END

以上就是卷积层和池化层的核心计算公式及简单示例。如果你对卷积神经网络有更多问题,欢迎进一步提问或留言讨论!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐