玩转 LeetCode Hot 100:滑动窗口两大万能解题模板与深度拆解
2026/6/10 14:51:16
摘要:卷积神经网络 (CNN) 是计算机视觉的基石。从模拟人类视觉的局部感知开始,CNN 经历了从 LeNet 到 ResNet 再到 ConvNeXt 的辉煌演进。本文将拆解 CNN 的核心操作(卷积、池化),回顾经典架构的设计哲学,并探讨现代 CNN 如何在 Transformer 时代焕发新生。
在全连接网络 (MLP) 中,处理图像面临两个巨大问题:
CNN 引入了两个核心思想来解决这个问题:
卷积操作本质上是特征提取。不同的卷积核可以提取不同的特征(边缘、纹理、形状)。
1x1 卷积的作用(重点):
看起来没用到邻域信息,但它可以在不改变特征图宽高的前提下,改变通道数 (Channel)。
- 通俗理解:想象输入是64层的“千层饼”。1x1卷积就像一根垂直插入的“探针”,它不看周围,只把这64层的信息揉在一起。
- 降维/升维:用32根探针,就得到了32层的新饼(降维);用128根,就变成了128层(升维)。这是网络变深且计算量可控的关键。
池化用于降采样,减少参数量,并带来一定的平移不变性。
指输出特征图上一个像素点,映射回原始输入图像上所能看到的区域大小。堆叠越多的层,感受野越大,能看到的整体信息越多。
Conv -> Pool -> Conv -> Pool -> FC的标准范式。在 2020 年后 Vision Transformer (ViT) 席卷 CV 领域时,Meta 推出了 ConvNeXt,证明纯 CNN 架构依然可以打败 ViT。
importtorchimporttorch.nnasnnclassResidualBlock(nn.Module):def__init__(self,in_channels,out_channels,stride=1):super(ResidualBlock,self).__init__()# 主路径 (Main Path)self.conv1=nn.Conv2d(in_channels,out_channels,kernel_size=3,stride=stride,padding=1,bias=False)self.bn1=nn.BatchNorm2d(out_channels)self.relu=nn.ReLU(inplace=True)self.conv2=nn.Conv2d(out_channels,out_channels,kernel_size=3,stride=1,padding=1,bias=False)self.bn2=nn.BatchNorm2d(out_channels)# 捷径 (Shortcut/Skip Connection)# 作用:确保输入 x 能和输出 out 形状一致,从而可以相加self.shortcut=nn.Sequential()# 如果 stride > 1 (图片变小了) 或者 in != out (通道数变了)# x 就没法直接加到 out 上,必须对 x 做个“整形手术”:# 1. 用 1x1 卷积调整通道数# 2. 用 stride 调整图片尺寸ifstride!=1orin_channels!=out_channels:self.shortcut=nn.Sequential(nn.Conv2d(in_channels,out_channels,kernel_size=1,stride=stride,bias=False),nn.BatchNorm2d(out_channels))defforward(self,x):identity=x# 备份原始输入# 主路径计算out=self.conv1(x)out=self.bn1(out)out=self.relu(out)out=self.conv2(out)out=self.bn2(out)# 残差连接:F(x) + x# 注意:这里的 shortcut(identity) 可能会对 x 进行下采样或升维out+=self.shortcut(identity)out=self.relu(out)returnoutCNN 从模拟生物视觉出发,通过卷积和池化实现了高效的图像特征提取。
虽然 Transformer 在大规模预训练上表现强势,但在边缘设备和实时应用中,CNN 依然是首选。