ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

卷积神经网络CNN核心原理与工程实践全解析

卷积神经网络CNN核心原理与工程实践全解析 卷积神经网络CNN这名字搞深度学习的人基本天天挂在嘴边。尤其这几年CV领域全是CNN的天下从人脸识别到自动驾驶从医学影像到短视频特效它几乎成了视觉理解的事实标准。哪怕你不做视觉做语音、做推荐、做时间序列预测也绕不开CNN的思想——因为它本质上干的事情特别朴素找规律、提特征、做判断。这篇文章我不打算写成像教材那样的长篇大论而是想以自己从零啃CNN到实际调模型踩坑的经验为线索把CNN的结构、原理、经典网络和实操要点一次性讲透。不管你是刚入门的学生还是准备在项目里用CNN的工程师这篇文章应该都能给你一个清晰的全局视图。我最早接触CNN是在大三做图像分类课设的时候当时对着LeNet-5的结构图看了整整一个下午感觉每一层都认识串起来就不认识了。后来自己手推过一次前向传播、用Python从零写过一次卷积操作才真正明白它为什么能work。这里我先说一个结论CNN之所以适合图像不是因为“神经网络”四个字有多玄而是因为“卷积”这个操作恰好匹配了图像的局部相关性和平移不变性这两个天然属性。后面我会分模块把这件事拆开讲清楚。1. CNN到底在解决什么问题1.1 全连接网络处理图像时遇到的麻烦在CNN出现之前人们尝试过用全连接网络Fully Connected Network, FCN做图像识别。做法很粗暴把图片的每个像素点拉成一长条向量然后扔进网络。比如一张32x32x3的彩色图片展开之后就是3072维的向量第一层如果256个神经元光这一层就有78万个权重参数。换个角度看如果输入是100x100的图片第一层全连接加一下参数量就直接上千万了。不说训练慢光内存都不一定放得下。更麻烦的问题是这种“全局展开”的方式完全破坏了空间结构。一张猫的图片把相邻像素拉远、把相隔很远的像素拉到一起对全连接层来说毫无区别它看到的只是一堆数字的乱序组合根本不理解“边缘”“纹理”“形状”这些概念。而且猫往左挪两个像素整张图在像素层面的数据就全变了网络就需要重新学一遍。这在工程上是不可接受的。1.2 卷积是如何天然适配图像数据的卷积操作和全连接最大的区别在于它只在局部窗口内做加权求和并且同一个卷积核会在整张图上滑动权重是共享的。这两个设计直接解决了上面两个问题。局部连接对应的是图像的局部相关性——相邻像素之间关系紧密远处的像素影响往往可以忽略所以只需要在局部范围内提取特征。举个生活化的例子你看一张猫脸照片判断“这是眼睛”根本不需要看完全图看到局部区域的黑色瞳孔和白色高光就足够了。这就是局部感受野的思想。权值共享对应的是图像的平移不变性——一个能识别“猫耳朵”的卷积核不管猫耳朵出现在图片左上角还是右下角都应该被同一个核捕捉到。因为权重共享网络参数量大幅下降。还以32x32x3的图为例如果卷积核大小是5x5深度是32那这层参数量是(5x5x31)x322432比之前全连接的几百万少了三个数量级。参数量少意味着不容易过拟合也意味着网络可以做得更深这是后来所有深度模型能跑起来的根基。1.3 CNN的三个关键设计准则局部感受野、权值共享、空间下采样把CNN的设计哲学总结成三条准则你在看任何一篇文章、任何一个网络结构时都可以用这三条去对照局部感受野Local Receptive Field每个神经元只连接输入的一个局部区域而不是全局。推荐阅读时我常拿“只看局部再拼整体”来类比。权值共享Weight Sharing同一层内的所有神经元共享同一套卷积核参数极大地降低了参数量也让模型对位置变化不那么敏感。空间下采样Spatial Subsampling通过池化或步长卷积不断缩小特征图尺寸一方面增大后续层的感受野一方面降低计算量同时提供一定的平移/旋转不变性。这三个准则在我看来就是CNN的全部秘密。你后面看一切CNN结构无论ResNet、DenseNet还是EfficientNet底层都是在围绕这三点做文章——怎么设计卷积核、怎么共享参数、怎么下采样最合理。2. 拆开CNN卷积层、池化层、全连接层到底在干嘛2.1 卷积层特征提取的主力干将卷积层是CNN的绝对核心。一个卷积层由若干个卷积核又称滤波器组成每个卷积核在输入特征图上按固定步长滑动每次滑动做一次点积运算得到一个数值这些数值组合起来就是一张输出特征图。有个初学者最容易犯迷糊的点卷积核的尺寸、步长和填充三者是如何决定输出特征图大小的公式其实特别简单输出尺寸 (输入尺寸 - 卷积核大小 2×填充) / 步长 1我举个例子输入是32x32卷积核3x3步长1填充1那么输出尺寸 (32-32×1)/11 32也就是说大小没变。这在很多现代网络中很常见目的是在卷积的同时控制特征图尺寸不剧烈缩小。如果padding0输出就是30x30每做一次卷积尺寸就缩小一圈做多了信息就丢光了。卷积核的通道数也要特别注意卷积核的通道数必须和输入特征图的通道数相同。比如输入是彩色图3个通道那3x3的卷积核实际上是3x3x3的三维张量而不是平面上的3x3。输出特征图的个数则取决于用了多少个卷积核——用了64个卷积核输出就是64通道的特征图。这一步理解透了后面看任何网络结构的参数表都不会懵。2.2 激活函数让网络具备非线性能力如果卷积层只做线性加权求和那不管堆多少层整个网络仍然是一个线性模型表达能力极其有限。所以每层卷积之后通常接一个激活函数给网络注入非线性。早期最常用的是ReLURectified Linear Unit它的定义就是max(0, x)计算简单、反向传播梯度稳定有效缓解了梯度消失问题。ReLU有个有意思的“濒死神经元”问题如果一个神经元的输入一直为负数经过ReLU后梯度永远是0权重就再也更新不了了。我在实际项目中就踩过这个坑——训练到一半发现部分特征图全是黑的那就是神经元死了。解决办法包括用Leaky ReLU、PReLU、ELU/SELU等变体。比如Leaky ReLU在负数区域给一个很小的斜率比如0.01让梯度能够流过去。不过老实说现在Transformer里的GELU和SiLU也很流行但对于CNN的常规任务ReLU和它的变体仍然是性价比最高的选择。2.3 池化层浓缩信息、降低计算、提升鲁棒性池化层的作用就是下采样。最常用的是最大池化Max Pooling和平均池化Average Pooling。最大池化在每个窗口内取最大值保留的是最强烈的响应特征平均池化取平均值保留的是区域内的整体强度。有人可能会问卷积本身也可以带步长来做下采样为什么还要池化这是个好问题。卷积确实能实现尺寸缩小但池化带来一个额外优势它不引入可学习参数而且最大池化天然具备一定的平移不变性对轻微的位置偏移不敏感。比如一只猫的眼睛在池化窗口内向左挪了两个像素取最大值的结果很可能还是一样相当于给网络加了一层“抗抖动”的buff。不过近几年的趋势是很多网络倾向用步长为2的卷积来代替池化因为卷积能学到的下采样策略往往比固定的池化规则更灵活。池化并没有被淘汰但在结构设计上它的地位不像早期那么不可动摇了。2.4 全连接层最终的决策输出卷积层和池化层做的事情是“特征提取”把原始像素一步步加工成高度抽象的语义特征全连接层做的事情则是“分类决策”——把提取到的特征拉平映射到样本标记空间。对于分类任务最后一层通常接一个Softmax把输出变成概率分布每个类别的概率加起来等于1。有一点需要强调全连接层在CNN中通常只出现在网络尾部而且是可选的。像全卷积网络FCN在语义分割任务中就不用全连接层而是用1x1卷积和上采样实现逐像素分类。近些年很多分类模型也会用全局平均池化Global Average Pooling代替全连接层比如GoogleNet和ResNet这样就把最后的特征图直接空间平均成一个向量参数量大大减少抑制过拟合的效果也不错。3. 从零理解CNN的工作流程一次前向传播的完整走读3.1 数据在CNN中各层之间的形状变化以LeNet-5为例来走读一次前向传播。LeNet-5是现代CNN的祖师爷1998年Yann LeCun设计的当年是用来识别手写数字的。输入是一张32x32的灰度图也就是单通道。第一步是卷积6个5x5的卷积核步长为1无填充输出尺寸 (32-5)/11 28因为用了6个卷积核输出是28x28x6。接着是平均池化窗口2x2步长2尺寸缩半变成14x14x6。再卷积一次16个5x5卷积核输出变成10x10x16再池化变成5x5x16。然后进入全连接层把5x5x16展平成400维的向量过两层全连接最后用10个输出节点对应10个数字类别。这就是一个最标准的CNN流水线卷积提取特征池化压缩尺寸全连接做分类。我强烈建议初学者把每一层的输入输出形状写在纸上推一遍能推通CNN的“骨架感”就建立起来了。当年我自己推第一遍的时候算出和论文参数表完全一致的那一刻才有一种“哦原来CNN不过是个张量变形流水线”的感觉。3.2 特征图的可视化CNN学到的东西长什么样理解CNN最直观的方式之一是看特征图。你训练完一个分类网络之后把某张测试图片输入进去保存中间层的输出你会看到浅层的特征图保留了大量空间细节看起来像是边缘检测器、颜色块检测器比如某个通道专门响应水平边缘某个通道专门响应垂直边缘。中层的特征图开始出现纹理、局部形状的概念比如车轮、眼睛、窗户这种语义部件。深层的特征图已经很难用人眼理解了每个通道可能对应的是某种高级抽象概念——某个通道对人脸激活某个通道对狗头激活。这其实说明了一个重要事实CNN不是黑箱它的每个通道都有明确的“功能分工”。这给实际项目带来的启发是——当你的网络效果不好时可以可视化特征图来定位问题。如果浅层特征图一片死寂可能是学习率太大或者网络初始化有问题如果深层特征图过于稀疏可能有大量dead ReLU。我调试模型时可视化特征图几乎是标配动作它帮你把“玄学”问题变成可见的工程问题。3.3 反向传播在CNN中是怎么工作的CNN的反向传播原理和普通神经网络一致都是基于链式法则。但有个特殊之处卷积层的反向传播实际上就是“卷积核翻转后的卷积操作”。我刚学的时候对这个点卡了很久后来自己推导了一遍才明白。这里简单解释一下输入x卷积核w输出y conv(x, w)。你不知道输入x的梯度是多少时梯度会从上一层反向传播到y。那么y对x的偏导在数学上可以证明等于把误差信号当作输入和旋转180度flip后的卷积核再做一个卷积操作。这个过程叫反卷积Deconvolution或转置卷积Transposed Convolution它不属于“用卷积来判断分类”而是属于“把梯度传回去”的计算手段。实际操作中你完全不需要手动实现这个流程PyTorch、TensorFlow这些框架的autograd引擎会帮你算好。但如果你在做模型剪枝、量化、自定义算子这类底层优化理解反向传播的具体张量变换就特别重要了。我当时为了给公司做推理加速花了整整一周啃卷积的反向传播实现最后把那个CUDA kernel调好之后性能直接翻倍那周的功夫就没白费。4. 经典CNN架构演进与选型建议4.1 从LeNet到AlexNet深度学习在视觉领域的爆发LeNet-5证明了CNN在手写数字识别上有效但受限于当时的数据规模和算力它没法扩展到更复杂的任务上。真正让CNN“出圈”的是2012年的AlexNet它在ImageNet图像分类竞赛上以top-5错误率15.3%的成绩碾压第二名第二名是26.2%直接引发了深度学习革命。AlexNet相对LeNet做的几个关键改动值得单独拎出来说一是规模更大卷积核更多网络更深二是用了ReLU激活函数让深层网络的训练变得稳定三是引入了Dropout做正则化在全连接层随机丢弃部分神经元极大地缓解过拟合四是用GPU并行训练这个在当年是创新现在已经是标配了。它用的数据增强策略比如随机裁剪、水平翻转、色彩抖动也成了后来所有项目的保留项目。从LeNet到AlexNet的演进逻辑特别清晰数据集更大、算力更强、技巧更成熟于是网络可以更深、更宽能在更复杂的任务上同时保持低过拟合。这种“数据算力技巧”三角驱动的路径后来一直被沿用。4.2 VGG用“小卷积核堆深度”的极简主义VGGVisual Geometry Group网络的贡献是提出了一种极其朴素的构建思路通篇只用3x3卷积核只用2x2最大池化通过堆叠卷积层来增加深度。VGG-16有16个权重层VGG-19有19个参数量主要集中在前面的卷积层最后的全连接层更是占了总参数量的很大比例。为什么3x3卷积核这么好用因为两个3x3卷积堆叠感受野等效于一个5x5卷积三个3x3卷积堆叠感受野等效于一个7x7卷积。但3x3卷积的参数量远小于大尺寸卷积核两个3x3卷积的参数是2×(3×3×C×C) 18C²一个5x5卷积的参数是25C²省了接近30%而且多堆一层中间就多一次激活函数非线性表达能力更强。这是个“增深度、减参数、加非线性”的三赢方案。VGG的结构非常规整很适合当基准模型来做迁移学习。我自己做工程时经常用VGG16在ImageNet上的预训练权重做初始化再在业务数据上微调收敛速度快而且效果底线有保障。缺点是模型体积大、推理慢不适合手机端或实时场景。4.3 ResNet残差连接如何解决深层网络的退化问题ResNet是2015年提出的解决了一个困扰大家的难题网络做到很深之后训练误差反而会上升不是过拟合而是网络退化degradation。这个问题并不是梯度消失那么简单因为Batch Normalization之类的技术已经缓解了梯度消失即使梯度能正常回传50层的网络也经常比20层的还差。ResNet的做法是引入残差块让某一层的输出不再是直接的映射H(x)而是H(x) F(x) x其中F(x)就是原本要学习的映射x是恒等映射的旁路连接。这样网络只需要学习“残差”F(x)当F(x)无用的时候它可以把权重学到接近0让输出约等于x网络就退化成浅层网络天然不会退化。这个设计精妙至极在数学上相当于把优化问题从“学习一个复杂映射”变成了“学习与恒等映射的差距”难度大幅降低。ResNet对工程实践的影响是全方位的。残差连接使得训练几百层的网络成为可能ResNet-152在ImageNet上的精度远超以前的模型。现在的任何主流CNN结构比如DenseNet、MobileNet、EfficientNet几乎都在用某种形式的skip connection。如果你要自己搭网络我强烈建议不管网络多浅都加上残差结构——它基本是“免费的午餐”。4.4 轻量化网络MobileNet和EfficientNet的实用选型落地到真实业务场景时你会发现实验室的SOTA模型往往跑不动——GPU卡不够、延迟要求高、内存预算紧。这时候轻量化网络就派上用场了。MobileNet的核心是深度可分离卷积Depthwise Separable Convolution把一个标准卷积分解成两步深度卷积Depthwise Convolution对每个通道单独做3x3卷积逐点卷积Pointwise Convolution用1x1卷积把通道信息融合起来。这样做在保持近似精度的前提下计算量能降到标准卷积的1/8到1/9。如果想更进一步可以在MobileNetV2里加入倒残差结构和线性瓶颈层精度和速度的平衡更优。EfficientNet的思路不太一样它不是简单把网络做轻而是用神经架构搜索找到一组最优的宽度、深度、分辨率缩放系数然后告诉你怎么均匀地缩放网络。这打破了以往“加深”、“加宽”、“加分辨率”三选一的思路直接按系数一起缩放。EfficientNet-B0到B7横跨了从移动端到云端的所有场景我实际使用时感觉它的精度-算力性价比确实是第一梯队的。选型建议上我个人的经验是如果目标设备是手机优先MobileNetV3或EfficientNet-Lite如果是服务器且追求精度先试ResNet50/ResNet101作为基线再考虑EfficientNetV2或ConvNeXt。极少有业务场景需要你自己从零训一个超深网络大多数时候用预训练的轻量模型领域微调性价比最高。5. 3D卷积神经网络当CNN遇上视频和体素数据5.1 从2D到3D卷积核的空间维度扩展2D CNN处理的是HxWxC的静态图像卷积核是KxKxC的立方体在H和W两个方向上滑动。当数据变成视频T帧HxW的图或者医学3D影像比如CT扫描的DxHxW体素时就需要处理四维甚至更高维的数据。3D卷积神经网络的处理方式很自然把卷积核从2D的KxK扩展成3D的KxKxK输入是DxHxWxC或者TxHxWxC卷积核在三个空间/时间维度上滑动。每一步卷积操作都同时聚合了空间邻域和时间邻域的信息。以视频理解里常见的C3D网络为例输入是一段16帧的clip通过多个3D卷积层逐步提取时空特征最后经过全连接层输出动作类别。3D CNN的代价也显而易见参数量和计算量随着维度爆炸式增长。同样是3x3x3的卷积核3D卷积的参数量是27C²是2D卷积9C²的3倍而且中间特征图体积更大显存压力非常明显。我记得第一次跑C3D16帧112x112的输入单卡就撑到了9GB显存这还是在batch size很小的情况下。5.2 3D CNN的典型应用场景与模型3D CNN最常见的落地场景有三个视频理解/动作识别判断一段视频里的人在做什么动作比如“挥手”、“跑步”、“摔倒”等。经典模型包括C3D、I3D、P3D、SlowFast等。I3D的做法很有意思它把2D卷积的权重“膨胀”成3D卷积利用2D预训练权重做初始化这样既省训练时间又能保证初始特征的合理性。SlowFast则是双路网络一条路低帧率抓空间语义一条路高帧率抓运动变化效率很高。医学影像分析CT、MRI数据天生是3D体素2D网络只能逐层切片分析丢失了层间上下文信息。3D CNN可以直接对立体体积建模在肺结节检测、脑肿瘤分割、器官分割等任务上精度明显更高。但医学数据的标注成本极高、样本量往往很小所以现在的主流做法是3D迁移学习配合强数据增强或者从2D预训练模型膨胀到3D。点云/体素数据处理像自动驾驶中的激光雷达点云可以转换成3D体素网格再通过3D CNN处理。不过点云数据的稀疏性会让标准3D卷积非常浪费——大量体素是空的。因此出现了稀疏卷积网络如Submanifold Sparse Convolution只对有效体素做卷积效率提升非常明显。5.3 3D CNN的工程挑战与优化方向工程上跑3D CNN最大的痛点是计算效率和显存占用。我自己踩过的坑和一个有效的优化手段可以分享给大家第一个是输入clip的选择。视频长度动辄几十秒但3D CNN的输入通常只是其中的一个小片段。不能简单均匀切片——因为动作可能只出现在某一小段均匀切片容易错过关键帧。实操上先用一个轻量模型做帧级重要性排序选出信息量最高的帧再组clip输入3D CNN效果会好很多。第二个是混合精度训练。3D CNN的计算对FP32开销极大直接上混合精度训练FP16前向FP32主权重更新在NVIDIA A100/V100上能获得1.5-2倍加速显存占用降30%-40%。我第一次在3D模型上用混合精度时训练时间直接从三天缩短到两天不到效果没有可见损失。第三个是使用2D预训练权重做初始化。从零训练3D CNN非常耗时且容易过拟合把ImageNet上预训练的2D权重膨胀成3D再在视频数据上微调收敛速度和精度都有显著提升。这个技巧在I3D和SlowFast中都验证过工程上非常管用。6. 训练CNN的实操经验与避坑指南6.1 数据预处理与增强的实战配置很多初学者把精力全放在模型结构上忽略了数据侧的关键细节。以图像分类为例最基础的预处理是标准化把像素值归一化到[0,1]再减去均值除以标准差。这样做的目的是让每个通道的输入分布接近标准正态加速收敛。PyTorch中可以用transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225])这几个数值对应ImageNet数据集的通道统计量是社区沉淀出来的通用配置。数据增强方面我建议按任务需求分层配置。简单的分类任务用随机裁剪加水平翻转就够了计算成本极低效果提升明显。复杂一点的场景比如人脸识别需要加随机颜色抖动、随机擦除、mixup等策略做目标检测还需要马赛克增强Mosaic。增强不是越多越好增强过度会让模型很难拟合真实分布导致训练震荡甚至不收敛。我见过一个团队做工业缺陷检测增强策略里加了极强的颜色扰动缺陷本身又很小模型完全学不进去最后一查是增强把缺陷特征都抹掉了。6.2 学习率、优化器与Batch Size的调参心得有个比较实用的经验先设一个偏大但能正常收敛的学习率比如0.1如果损失发散就减半找到合适区间后再微调。学习率调度上CosineAnnealing和StepLR是两类主流前者适合长时间训练追求最佳精度后者适合快速实验对比。优化器上SGDMomentum对CNN依然非常稳定Nesterov加速也不错几乎适合所有视觉任务。Adam收敛快但最终精度略低于调好的SGD所以很多论文和工业基线默认用SGD。还有一点使用预训练权重时新加层和预训练层的学习率应该分开设置。预训练层用较小的学习率做微调新层的随机初始化需要更大学习率快速收敛。我在PyTorch里一般给新层设置10倍于基础层的学习率效果显著比一刀切好。Batch Size的选择会影响BatchNorm统计量的稳定性。Batch Size过小BatchNorm的均值和方差估计噪声大模型容易不稳过大的Batch Size又会超出显存限制。实践中如果Batch Size只能设到8或更小建议把BatchNorm换成GroupNorm或LayerNorm稳定很多。6.3 过拟合与欠拟合的快速诊断清单我在日常实验中判断模型状态靠一张清单这里直接分享出来现象原因对策训练损失不降学习率太高/网络设计有bug降低学习率检查数据-标签对齐训练损失降、验证损失先降后升过拟合加Dropout、加数据增强、减小模型容量训练损失和验证损失都高欠拟合/模型容量不足加深度加宽度、去掉Dropout、多训练几个epoch验证损失震荡大Batch Size过小或学习率过大增大Batch Size或降低学习率训练到一半损失突然飙高学习率过高导致梯度过冲恢复某个checkpoint降低学习率这张表在我多年实验里命中率很高。还有一个判断技巧如果模型在训练集上的准确率很高比如99%验证集上低很多那不是模型不行是你泛化措施不够重点看正则化和增强就对了。6.4 可视化与调试的四个实用工具训练CNN不是丢进去等结果就完事必须盯住训练过程中的动态信号。第一个是TensorBoard或者WandB。必须记录至少四个曲线训练损失、验证损失、训练精度、验证精度。看训练损失和验证损失的间距变化是判断过拟合时机的最直接信号。第二个是特征图可视化。我常把网络中间层的特征图按通道画出来看有没有大面积变暗或全零的情况。如果50%以上的通道基本没激活检查一下你的初始化和激活函数选择是否有问题。第三个是梯度范数统计。训练早期梯度范数如果直接爆炸到1e5以上赶紧降低学习率如果长时间在1e-7以下可能有梯度消失问题可以试试残差连接或者BN层调整。第四个是混淆矩阵和错误的样本。分类任务只看整体准确率是不够的要定期打印混淆矩阵看看哪些类别互相混淆然后针对错误样本做bad case分析。我在一个工业项目里发现模型一直把“划痕”识别成“纹理”实际原因是训练数据中“纹理”类包含了大量“划痕类”的图纯数据标注问题——这靠调模型是永远调不出来的必须回去清理数据。6.5 部署阶段的量化与剪枝经验训练结束还远没有完事真正上线要考虑推理速度。最常用的压缩手段是权重量化把模型权重从FP32降到INT8模型体积缩小为原来的1/4推理速度在支持INT8的硬件上提升2-4倍。PyTorch的torch.quantization或者ONNX Runtime都提供了成熟的量化工具。量化对精度的损失通常很小1%-3%如果损失过大优先用量化感知训练QAT而不是训练后量化PTQ。剪枝方面结构化剪枝比如剪掉不重要的通道比非结构化剪枝更实用因为非结构化剪枝产生的稀疏矩阵难以在常规硬件上获得加速。我自己做通道剪枝的流程是训练一个over-parameterized的模型按BN层gamma值排序剪掉gamma接近0的通道然后微调恢复精度。这个流程简单有效对ResNet系列的压缩率通常能到40%-50%而精度不掉。最后分享一个心得CNN训练和部署的每个环节都有“公认最优做法”和“经验法则”但它们不是金科玉律。最好的策略永远是先跑通一个小规模的基线再对照诊断清单逐步调整。7. 我这些年用CNN沉淀下来的几条体会如果只能从这篇文章里带走几条信息我会建议你记住这几条第一CNN的底层逻辑就是局部感受野、权值共享、空间下采样三件事所有网络结构都是这三件事的变体组合。把这三件事理解透你看任何模型都会快很多。第二遇到新的视觉任务先别急着设计新结构用预训练的ResNet或EfficientNet做baseline把数据管好、把训练流程调试稳定往往就能拿到不错的效果。绝大多数项目的瓶颈都不在网络结构而在数据质量和训练技巧。第三调试的时候不要凭感觉猜用可视化和曲线说话。特征图、梯度、损失曲线、混淆矩阵这些信息会告诉你问题到底出在哪一层、哪个环节。做CNN这些年我最大的感受是它没有想象中那么神秘但也没有简化到可以纯靠调库调参。真正需要花功夫的是理解每一层在做什么、每个超参数在影响什么、每个现象背后对应什么原因。这篇综述把我自己的经验脉络整理了一遍如果你能顺着这个脉络把CNN的路走通一遍后面再学Transformer、扩散模型这些新东西时理解成本都会低很多。
返回列表