Skip to content

卷积神经网络

卷积神经网络(Convolutional Neural Network, CNN)主要用于处理具有局部结构的数据,例如图像、二维网格和部分序列信号。它通过卷积核在空间上滑动,提取局部特征。

概念详解

二维卷积可写成:

Yi,j=m=0kh1n=0kw1Wm,nXi+m,j+n+b

其中 W 是卷积核,kh,kw 是核大小。多个卷积核会产生多个输出通道。

CNN 的重要性质:

  • 局部连接:卷积核只关注局部区域。
  • 参数共享:同一个卷积核在整个图像上复用。
  • 平移等变:输入平移时,特征图也相应平移。

输出尺寸推导

设输入尺寸为 H×W,卷积核为 K,padding 为 P,stride 为 S,输出高度为:

Hout=H+2PKS+1

宽度同理:

Wout=W+2PKS+1

例如 H=32,K=3,P=1,S=1,则:

Hout=32+231+1=32

因此 3×3 卷积配合 padding=1 可以保持空间尺寸不变。

应用代码

python
import torch
from torch import nn

class SmallCNN(nn.Module):
    def __init__(self, num_classes=10):
        super().__init__()
        self.features = nn.Sequential(
            nn.Conv2d(1, 16, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2),
        )
        self.classifier = nn.Linear(32 * 7 * 7, num_classes)

    def forward(self, x):
        x = self.features(x)
        x = x.flatten(1)
        return self.classifier(x)

model = SmallCNN()
x = torch.randn(8, 1, 28, 28)
logits = model(x)
print(logits.shape)

小结

CNN 通过局部感受野和参数共享显著减少参数量。它适合图像任务,也是 U-Net、ResNet 和很多视觉生成模型的基础模块。