
深度学习基础讲完了这篇进入CNN。卷积神经网络是计算机视觉的核心架构从2012年AlexNet夺冠到现在几乎所有视觉任务的基础都是CNN。做机器人视觉CNN是必须搞懂的。你可能听说过CNN但不太清楚它为什么比普通全连接网络好。核心原因就两个字局部。全连接网络把图像展成一维向量丢失了空间结构。CNN用卷积核在图像上滑动每次只看一小块区域天然保留了空间关系。面试中CNN相关的追问非常多——卷积怎么算的、感受野是什么、1x1卷积有什么用、池化层能不能去掉。把这些概念理解透彻后面看各种骨干网络才不会懵。一、卷积运算卷积的核心操作很简单一个小矩阵卷积核在输入图像上滑动每个位置做逐元素乘法再求和得到一个输出值。# 卷积运算示意 # 3x3卷积核在5x5输入上滑动 output[i,j] sum(kernel * input[i:i3, j:j3])几个关键参数卷积核大小kernel_size通常3x3。更大的卷积核5x5、7x7一次看更大区域但参数量增加快。两个3x3卷积的感受野等于一个5x5但参数更少2*918 vs 25还能多一层非线性。所以现代网络几乎都用3x3。步长stride卷积核每次移动多少格。stride2时输出尺寸减半。用来代替池化层做下采样。填充padding在输入边缘补零。padding1配合kernel_size3和stride1输出尺寸和输入一样。不补零的话每次卷积输出都会缩小。通道数channelsRGB图像有3个输入通道。卷积核的通道数要和输入一致。输出通道数决定了特征图的深度——输出通道越多网络能学到的特征越丰富。import torch.nn as nn # 输入: 3通道 224x224图像 # 输出: 64通道 112x112特征图 conv nn.Conv2d(3, 64, kernel_size7, stride2, padding3)参数量计算一个卷积层的参数量 kernel_size * kernel_size * in_channels * out_channels out_channels偏置。比如3x3卷积、64输入通道、128输出通道参数量 964128128 73856。二、关键组件CNN不只是卷积层。几个关键组件配合工作。池化层Pooling降低特征图尺寸。Max Pooling取区域最大值保留最显著的特征。Average Pooling取区域平均值。全局平均池化GAP把整个特征图压缩成一个值替代全连接层做分类。1x1卷积看起来没用只看一个像素实际作用很大。一是跨通道信息融合——把多个通道的信息混合。二是升降维——减少或增加通道数。比如先用1x1卷积把256通道降到64再做3x3卷积最后用1x1恢复到256通道。这就是Bottleneck结构ResNet的核心。Batch Normalization放在卷积之后、激活函数之前。对每个mini-batch的特征做归一化加速训练、提升稳定性。推理时用训练期间累积的均值和方差。# 经典的Conv-BN-ReLU组合 class ConvBlock(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() self.conv nn.Conv2d(in_ch, out_ch, 3, padding1) self.bn nn.BatchNorm2d(out_ch) self.relu nn.ReLU(inplaceTrue) def forward(self, x): return self.relu(self.bn(self.conv(x)))残差连接Skip Connection把输入直接加到输出上。解决深层网络的梯度消失问题。梯度可以跳过卷积层直接传到前面的层。这个设计让训练100层以上的网络成为可能。三、感受野感受野是CNN里一个非常重要的概念。它指的是输出特征图上一个像素点对应输入图像上的区域大小。网络越深感受野越大。第一层卷积的感受野是3x3两层3x3卷积的感受野是5x5三层是7x7。每加一层池化stride2感受野翻倍。感受野决定了网络能看到多大的上下文。目标检测需要大感受野才能看到完整的目标。语义分割需要大感受野才能理解全局结构。# 感受野计算公式 # 当前层感受野 前一层感受野 (kernel_size - 1) * stride累积 receptive_field 1 for layer in layers: receptive_field (layer.kernel_size - 1) * stride_product增大感受野的方法增加网络深度堆更多层、用stride2的下采样、用空洞卷积Dilated Convolution在不增加参数的情况下扩大感受野、用池化层。空洞卷积在语义分割里用得很多。通过设置dilation rate卷积核的元素之间插入空洞一个3x3的空洞卷积dilation2感受野等于5x5但参数量不变。转置卷积Transposed Convolution也叫反卷积用来上采样——把小特征图变回大尺寸。语义分割和生成对抗网络里大量使用。注意它不是数学上的逆操作只是前向传播时做了相反方向的尺寸变换。实际使用中容易出现棋盘效应输出不均匀可以用插值卷积来替代。四、经典CNN架构演进从LeNet到ResNetCNN架构经历了几次重大演进。LeNet-51998第一个实用的CNN用于手写数字识别。结构很简单——卷积池化卷积池化全连接。AlexNet2012ImageNet竞赛冠军引爆深度学习。用ReLU替代Sigmoid、用Dropout防过拟合、用GPU加速训练。VGGNet2014证明了深度的重要性。全部用3x3卷积堆到16-19层。结构规整被广泛用作特征提取器。GoogLeNet2014Inception模块——在同一层用多种尺寸的卷积核1x1、3x3、5x5让网络自己选择最合适的感受野。用GAP替代全连接层参数量大幅减少。ResNet2015残差连接解决了深层网络训练困难的问题。50层、101层、152层都能训练。核心思想是让网络学习残差函数F(x)而不是直接学习H(x)即H(x)xF(x)。如果F(x)0网络至少能保持恒等映射不会比浅层网络差。至今仍是使用最广泛的骨干网络之一。ResNet-50在目标检测、图像分类、特征提取等任务中都是默认选择。五、面试高频追问Q为什么CNN比全连接网络适合处理图像A三个原因。一是局部连接——卷积核只看局部区域保留了空间结构。二是参数共享——同一个卷积核在整个图像上共享参数大幅减少参数量。三是平移不变性——目标在图像任何位置都能被检测到。Q1x1卷积的作用是什么A跨通道融合和升降维。比如ResNet的Bottleneck结构1x1卷积降维→3x3卷积→1x1卷积升维。既减少了计算量又保持了表达能力。另一个用途是替代全连接层——在特征图上做1x1卷积等价于对每个位置做全连接。Q感受野不够大怎么办A四种方法。增加网络深度堆更多卷积层。用stride2下采样。用空洞卷积dilated convolution。加池化层。实际中通常组合使用。CNN是计算机视觉的基石。卷积运算、关键组件、感受野概念、经典架构演进这四个方面理解了后面的高级模型就都有了基础。下一篇我们聊经典骨干网络ResNet和EfficientNet。CNN卷积神经网络是计算机视觉的核心架构。卷积运算原理、关键组件设计、感受野概念、经典架构演进这四个维度构成了CNN的完整知识体系。上一篇第286篇 深度学习基础下一篇聊经典骨干网络ResNet/EfficientNet。如果这篇文章对你有帮助欢迎点赞支持一下你的鼓励是我持续更新的动力