ARTICLE DETAIL

资讯详情

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

CNN卷积神经网络从原理到实战:经典网络结构与调参经验全解析

CNN卷积神经网络从原理到实战:经典网络结构与调参经验全解析 我不是做图像这行之前一直觉得卷积神经网络CNN是个特别玄乎的东西。最早在论文里看到那一串结构图感觉像某种电路板布线图完全搞不明白为什么要把图片的像素点搞成一层一层的方块。后来真把手放到项目里用CNN跑过几个实际任务才发现这东西的思路其实特别朴素它做的事情本质上就是在模拟人眼“先看局部再看整体”的过程。这篇综述我不打算堆公式也不打算把几十个模型的细节全部拉出来只希望把CNN从动机到结构、从经典模型到调参踩坑讲透让刚接触深度学习的朋友读完能直接上手也让已经入门的人能重新梳理一下自己的知识框架。如果你正在学图像分类、目标检测、语义分割或者只是好奇为什么深度学习一遇到图片问题首选就是CNN那这篇文章适合你。我会从“为什么非得用卷积”讲到“网络到底在学什么”再结合LeNet-5、VGG、ResNet这些经典结构聊聊设计的逻辑最后放一批实际训练中经常会踩的坑和排查思路。保证没有废话全是实操里验证过的东西。1. 为什么非要用卷积——CNN的动机拆解1.1 全连接网络处理图片的三个尴尬咱们先把问题摆出来如果不用CNN直接用全连接神经网络去处理一张图片会发生什么假设输入是常见的224x224彩色图通道数是3那么这张图展开成一个向量长度就是224x224x3150528。如果第一层全连接就想输出256个特征那这一层需要训练的参数量就是150528x256个权重再加上256个偏置算下来接近3850万个参数。这才只是第一层。网络稍微深一点参数量会立刻飙升到普通人看一眼就想关掉页面的程度。模型很难训内存吃不消还特别容易过拟合——训练集表现很好换到验证集上就崩。第二个问题在于全连接网络把每个像素都当成独立的输入特征像素和像素之间的空间关系完全被打散了。你把它展开成一维向量那一刻左边邻居和右边邻居在向量里的位置隔了十万八千里网络根本不知道上下左右的相对位置。可图像识别这件事情恰恰极其依赖局部空间关系判断一只猫看的是眼睛、耳朵、胡须这些局部特征的组合方式而不是某一个孤立像素值。第三个问题更隐蔽全连接网络对位置的敏感度高得离谱。一张猫的图片把猫平移几个像素在全连接网络看来可能就是完全不同的输入但语义上它还是同一只猫。这叫做缺乏平移不变性会导致模型需要大量不同的位置样本来学习同一个模式数据需求成倍增加。所以问题的核心可以总结成三点参数爆炸、空间结构丢失、平移敏感性。CNN在这三个方向上给出了相对优雅的解法。1.2 卷积操作到底在干什么很多人第一次看卷积的定义会懵卷积不就是加权求和吗确实是这样。一个卷积操作就是拿一个小窗口卷积核在输入图像上从左到右、从上到下滑动每滑到一个位置把窗口内的像素值和卷积核对应的权重相乘再全部加起来得到一个输出值。我之前在不熟悉的人面前解释过一句话卷积核就是一个“局部模板”它专门在不同位置找同一种模式。比如某个卷积核训练出来以后权重分布恰好是一个垂直边缘检测器那么图像里凡是垂直线条比较明显的地方经过这个卷积核后输出的响应值就会很高。其他位置响应就低。所以卷积层提取到的特征图本质上是输入图像在每个位置的“相似度响应图”。为什么这里不用人去设计模板因为图像特征实在太多了——边缘、纹理、颜色块、形状部件——人工设计一套通用模板几乎不可能而且不同任务需要的特征不一样。CNN训练的过程就是用梯度下降不断调整这一堆卷积核的权重让它们自己“长”成适合当前任务的特征检测器。一开始随机初始化的小窗口训练完以后居然真的能对应到生动的视觉模式这是我入行这么久依然觉得最神奇的事情之一。1.3 三大核心特性从哪来CNN的三大杀手锏全部是从卷积这个操作直接推导出来的局部连接、权值共享、下采样。这三个词在教材里经常出现但很多人只是背下来没理解它们为什么不约而同指向效率。局部连接就是指每个输出像素只跟输入的一小块区域有关卷积核多大感受范围就多大。比如3x3的卷积核输出每个位置只看到输入的3x3区域。这样一来每个参数只作用于局部整个网络的学习负担被分摊到不同位置参数量大幅下降。权值共享更好理解因为同一个卷积核会滑过整张图像的所有位置所以对图像不同区域用的是同一套权重。这带来了一个额外的好处检测猫眼的卷积核不管猫眼出现在图片左上角还是右下角都能被同一个卷积核识别出来。这就是为什么CNN天然对平移有更强的鲁棒性。下采样则是我们常说的池化或者卷积步长设置它把特征图的分辨率降下来让网络逐步从“看细节”过渡到“看整体”同时进一步减少后续层的计算量。这三者合在一起CNN在图像任务上的表现就把全连接网络远远甩开了。2. CNN基本结构三个积木块2.1 卷积层特征提取的核心CNN的第一块积木是卷积层。每次卷积操作需要确定的超参数有四个卷积核尺寸K、步长S、填充P、输出通道数C_out。卷积核尺寸K决定了每次观察的局部窗口大小。最常用的是3x3少数任务会用5x5或7x7。并非越大越好大卷积核感受野大、能捕捉更大范围的信息但参数量按平方增长而且更容易忽略局部细节。一个3x3的卷积核只有9个参数而7x7的卷积核是49个参数差距很明显。后面讲VGG的时候会特别提到大卷积核的感受野完全可以用堆叠小卷积核替代。步长S是每次滑动的距离。步长为1时输出特征图大小和输入接近步长为2时特征图尺寸减半相当于做了一次下采样。填充P处理的是图像边缘问题。想象一下3x3卷积核滑到图像最边缘如果不对边界做处理输出尺寸会比输入小一大圈多次卷积以后特征图越变越小边缘信息也被快速丢弃。常见的做法是进行边界填充比如填0让卷积核也能滑动到原图像边缘的位置。这么做既控制了输出尺寸又能保留边缘区域的特征。输出通道数C_out是这一层要学习的卷积核数量。输入图像通常有多个输入通道比如彩色图是3通道每个卷积核会对所有输入通道分别做卷积再把结果相加形成一个输出通道。这里的直觉是每个输出通道代表一种特征的响应图所以通道数越多这一层能捕捉的模式越丰富。卷积后输出尺寸的计算公式是(W - K 2P) / S 1向下取整。我自己写网络结构的时候每次都会套这个公式算一遍光靠直觉经常翻车。比如输入224x2243x3卷积、步长1、填充1输出就是(224 - 3 2x1) / 1 1 224。如果步长改2输出就是112特征图直接缩一半。这个公式一定要烂熟于心因为后面设计网络时每个特征图尺寸都要靠它推导。卷积层之后通常跟一个激活函数最常用的是ReLU公式是max(0, x)。为什么不用Sigmoid训练深层网络时Sigmoid在输入很大或很小时梯度几乎为0多层反向传播一乘梯度直接消失网络根本训不动。ReLU在正区间的梯度恒为1传递效率高得多而且计算极简单。虽然ReLU的负区间一刀切把信息直接置零导致一些神经元会“死掉”但实践中大家普遍觉得它的优点远大于缺点。这几年也出现了LeakyReLU、GELU、SiLU之类的改进版本但入门阶段用ReLU绝对够用。2.2 池化层降维但别丢关键信息池化层的作用是下采样通俗说就是把特征图缩小。常见的有最大池化MaxPooling和平均池化AveragePooling。最大池化是在一个窗口里取最大值作为输出。比如2x2、步长为2的最大池化把每个2x2小区域压缩成一个数。它做的事情是在一个局部区域内只要某处响应急剧某个特征出现了就保留这个最大响应忽略其他位置的细节。这种操作对特征位置的小扰动有很好的容忍度一个特征在窗口内稍微偏移池化后仍然能检测到。还有就是抗噪能力强个别异常像素点不太容易影响结果。平均池化则把一个窗口内的值取平均。它更适合在最后阶段使用比如把整张特征图求平均得到一个全局特征向量这种做法叫全局平均池化Global Average Pooling。全局平均池化很有价值因为它在网络尾部直接消除了全连接层的大规模参数让每个通道的响应图变成一个数字有效防止过拟合同时能保留每个通道的语义含义。这里有个我早期踩过的坑池化不是越多越好。多一次池化特征图分辨率减半空间细节就会丢失一部分。如果任务本身对细节很敏感比如医学图像中的细小病灶检测、文字识别中的笔画差异池化太多可能反而伤害精度。现在很多新模型干脆直接用步长为2的卷积层替代池化层道理是一样的只是把下采样的过程中也加入可学习的参数方法灵活一些。经典结构里用池化多现代结构里步长卷积更常见但两者的底层逻辑是相通的。2.3 全连接层把特征拼成结论卷积和池化算是把图片吃进来提取出一堆特征图但这些特征图只是一组数字离最终结论还差一步。全连接层做的事情很直白将特征图展平为一维向量再通过若干层全连接变换输出最终的分类得分。为什么全连接要放在最后因为卷积层和池化层做的工作是特征提取和空间压缩本质上是把“像素级别的信息”转换成“语义级别的信息”。到了最后阶段一张特征图的尺寸已经变得非常小比如7x7甚至1x1此时它的空间信息已经高度抽象每个通道对应的是“图像中是否存在某种模式”。全连接层再把所有通道的组合关系学一遍相当于做分类器。如果一开始就用全连接去处理原始像素参数会爆炸而且学不到局部层次结构前面已经说过了。当然全连接层很容易带来大量参数。VGG最后三层全连接的参数量占总参数量的绝大部分。后来出现了用全局平均池化替代全连接的方案直接对最后一层特征图每个通道做平均得到向量后softmax分类效果更简洁且不容易过拟合。设计网络时我会建议优先用全局平均池化真需要全连接时再引入并配合Dropout防止过拟合。3. 经典CNN网络演进从LeNet-5到ResNet3.1 LeNet-5一切的起点Yann LeCun在上世纪90年代提出LeNet-5用于手写数字识别这是现代CNN结构最早的开山之作。论文里那个经典的网络结构放在今天看依旧清晰卷积、池化、卷积、池化、全连接、输出。LeNet-5的大致结构是输入是32x32的单通道灰度图第一层卷积用6个5x5卷积核输出6张28x28的特征图第二层是2x2平均池化把特征图降到14x14第三层卷积用16个5x5卷积核得到16张10x10特征图再经过一次平均池化降到5x5然后展开成120维向量经过一个84维的全连接层最后用10个输出节点做数字分类。整体参数量不过几万个放在今天的标准下算是轻量网络。我第一次在MNIST上复现LeNet-5时还是很感慨的这么简单的结构在没有任何预训练、没有复杂调参的情况下准确率能轻松达到99%以上。它证明了CNN在图像任务上的核心设计——局部连接、权值共享、层次化特征提取——是对的。所有后来复杂网络本质都是在这个框架上做深、做宽、做优化。那段时期的CNN也遇到过尴尬。受限于数据规模和算力LeNet之后CNN经历了一段相当长的低谷期。手写数字识别还行但换到更复杂的自然图像任务准确率迟迟上不去。这导致很长一段时间里计算机视觉领域的主流方法还是人工设计特征加传统机器学习分类器。直到2012年AlexNet在ImageNet上夺冠CNN才重新回到聚光灯下。3.2 AlexNet与VGG加深加宽AlexNet的成功核心变量有三个大规模数据ImageNet、更强的GPU算力、以及一套针对深层网络训练的工程技巧ReLU、Dropout、数据增强。它在架构本身并没有颠覆性的理论突破但它第一次证明了只要条件到位足够深、足够宽的CNN能在复杂视觉任务上碾压传统方法。AlexNet做了几件关键事情。ReLU激活解决了梯度消失问题Dropout在训练时随机关闭部分神经元让模型不那么依赖某些单一节点数据增强比如随机裁剪、水平翻转生成更多样的训练样本。网络结构上它用了11x11、5x5、3x3的混合卷积核总共8层5层卷积3层全连接参数量约6000万个在2012年那是相当夸张的规模。VGG则从中给出了一个非常重要的设计规律用多个连续的小卷积核替代一个大卷积核。比如两个3x3卷积串联的感受野是5x5三个3x3卷积串联的感受野是7x7但参数量大幅下降。两个3x3卷积的参数总量是2x3x318而一个5x5卷积是25三个3x3是27一个7x7是49。更重要的是每多一层卷积就多一次非线性激活网络的表达能力更强。VGG用这个思路把网络堆到了16层、19层结构极其规整每经过若干次3x3卷积就接一次2x2最大池化通道数从64逐渐翻倍到512。VGG的做法为后续研究提供了一个统一的深度网络模板虽然现在不太常用作主网络因为参数多、计算慢但做迁移学习的主干网络时VGG结构依然是个稳妥的选择。3.3 GoogLeNet与ResNet让网络“更深”背后的智慧到VGG为止设计思路基本就是“更宽、更深”但网络不可能无限加深。一方面参数太多训练慢、易过拟合另一方面梯度通过深层反向传播时数值会变得不稳定模型难以收敛。GoogLeNet核心是Inception模块和ResNet从两个角度解决了这个问题。Inception模块的思路有些像“让网络自己选路”。以前大家要绞尽脑汁决定用多大的卷积核Inception干脆把1x1、3x3、5x5卷积和3x3池化并列放在同一层各算各的再把输出在通道维拼接起来。这样不同尺寸的感受野可以同时捕捉粗细颗粒度的特征。但它带来的问题是计算量太大怎么压缩Inception的聪明之处是在大卷积核前加一个1x1卷积做降维先在通道维度上把数量压下来再做卷积运算计算量瞬间小很多。为什么要用1x1卷积这个单像素卷积核的空间感受野只有1x1看起来没法提取空间特征但它的作用在通道维度上做线性组合。再加上它配有ReLU非线性也相当于一层带激活函数的全连接变换只是作用在通道方向上。更关键的是1x1卷积可以自由调整通道数降维省计算量升维增加表达能力是特别轻巧实用的操作。ResNet应对深层次训练难题的方案更直接在网络里加一条“高速公路”让求导或者学习变得容易。残差块的定义是输出y F(x, W) x其中F是若干卷积操作的结果x叫恒等映射。这样一来网络需要学习的是F(x)这个残差而不是直接拟合目标函数。如果F(x)学到0输出就是x信息流可以直接跳过这几层。这意味着即使堆叠几十层、上百层梯度也能通过恒等路径顺畅地反传避免深层网络的“退化问题”。我每次看ResNet的图都会感慨别人想尽办法让每一层更好地拟合目标ResNet却干脆允许某些层“什么都不学”。这种反直觉的松弛反而让优化的路径变得异常平坦。在实践里50层、101层的ResNet都能稳定收敛这在残差结构出现前几乎不可想象。3.4 经典网络家族对照表把几个标志性网络放一起对比会更直观网络年份核心创新参数量级关键意义LeNet-51998卷积池化全连接的标准范式6万奠定CNN基本框架AlexNet2012ReLU、Dropout、双GPU并行、数据增强6000万深度学习在视觉任务上的里程碑VGG2014规整的3x3小卷积堆叠结构统一1.38亿揭示小卷积核深堆叠的优势GoogLeNet2014Inception多尺度并行1x1降维500万高效利用计算资源ResNet2015残差连接解决深层优化问题2500万让上百层网络成为可能这里想多说一句看参数量不要只看大小。GoogLeNet的参数比VGG少了一个量级精度却更高说明高效的结构设计比单纯堆参数重要得多。后来做实际项目时我也慢慢体会到与其盲目选最重的模型不如根据数据量、算力和任务难度选合适规模的结构。4. 实操及调参经验训练跑通只是第一步4.1 数据准备与涨点常识很多初学者以为CNN就是建好模型跑起来但实际上数据处理对效果的影响一点也不比模型结构小。最基本的操作是归一化图像像素值范围是0到255如果直接输入网络数值量级太大第一层卷积的权重更新会很不稳定。实践中会把像素归一化到[0,1]或者进一步做标准化比如每个通道减去均值除以标准差。现在很多框架内置了类似Normalize的工具算的是ImageNet数据集的整体均值方差当你的数据不是自然图像时最好根据自己数据重新算。数据增强是提升泛化能力特别管用的手段。随机水平翻转、随机裁剪、随机旋转、颜色抖动这些方法等于不花钱扩充训练样本。做图像分类时随机裁剪通常会让模型对目标位置不那么敏感鲁棒性提升很快。至于产量更大的Mixup、CutMix这类方法它们能把两张图混合起来训练让模型不光学会锐利的分类边界还能理解样本之间的连续性。我个人做小数据集时CutMix和Mixup是涨点最明显的两个增强之一。这里有一个容易忽视的细节增强策略也要考虑推理时行为。比如你训练时做了RandomResizedCrop但测试时要保证测试集输入的分布和训练一致通常用Resize到固定尺寸加CenterCrop或者缩放后再归一化。我见过不止一个人训练时准确率奇高推理时忘记做预处理输入分布变化直接把效果打崩。4.2 训练与超参学习率是最大的杠杆训练CNN最重要的超参数就是学习率。学习率太大loss会在一个高上下起伏模型完全无法收敛学习率太小loss长期不下降训了十几个epoch还跟刚开始差别不大。我自己常用的一套初始值是Adam优化器配1e-4或3e-4的学习率SGD配0.01加动量0.9加权重衰减1e-4。原因是Adam自带自适应缩放对学习率的要求宽泛SGD收敛效果往往更好但需要更细致的调度策略。学习率调度也特别重要。常见方式是cosine退火或分段衰减训练到某个epoch时学习率减半或乘以0.1损失曲线会出现明显的下降台阶。近些年warmup也变得流行训练前几个epoch用一个很小的学习率做预热再逐步升到目标值能够有效避免深层模型在开局阶段因参数剧烈波动而不稳定。BatchNorm批归一化几乎是现在任何CNN的默认组成部分做在每层卷积之后、激活函数之前。它对每个通道的mini-batch做归一化让特征分布保持稳定收敛速度快很多还允许你用更大的学习率。BatchNorm特别大的优势在于它本身有可学习的缩放和偏移参数所以就算初始分布再乱模型也能慢慢修正。这里有一条经验BatchNorm之后通常不需要Dropout那么强因为批归一化本身自带正则化效果。如果同时开很重Dropout有时反而会伤精度。4.3 迁移学习是客观的起跑线聊到实操绕不开的一个现实是你手里的数据量绝大多数情况下撑不起从零训练一个大网络。ImageNet有120万张图片、1000个类别普通人手头能有几万张高质量标注图已经算很厉害了。没有大规模数据从头训练深层CNN很容易陷入过拟合或长时间不收敛。所以现在做图像任务的标准起跑线是迁移学习加载一个在ImageNet上预训练过的模型权重比如ResNet、EfficientNet然后把最后几层替换成自己任务的分类头再做微调。前几层卷积学到的是边缘、纹理、色块这些通用低级特征在很多视觉任务里都通用。微调时可以选择冻结前层只训练后面的分类头或者全量微调。数据量越小越倾向于只训练其后端。我在项目中选择微调的惯例是如果数据在1万张以下冻结前80%的层只训练最后几层和新增的分类头如果数据超过几万张可以考虑全量微调并把学习率调低到预训练任务的一半甚至更低比如SGD用1e-3、Adam用1e-5。直接放原始学习率去微调预训练特征会被快速破坏出现loss先降后升的奇怪现象。5. 常见问题与排查技巧实录5.1 过拟合loss低但测试差模型在训练集上表现越来越好验证集上却停滞甚至变差这就是过拟合。我在项目里最常用的一整套组合拳是增强数据特别是强随机增强、更大权重衰减、加Dropout、减小模型容量换更小的网络、用早停法监测验证loss。如果上述方法都试完还是过拟合最根本的解决办法还是去补充更多数据。合成数据、半自动标注、数据增强能合法增长数据量的途径我基本都会考虑的。5.2 不收敛或loss异常loss变成NaN常见原因有三个学习率过大把loss顶飞了数据里存在异常像素值比如255的输入到loss里直接溢出模型某些层数值不稳定。排查方法是先用很小的学习率跑几个step看loss是不是能正常下降再把输入数据规范化免掉非法值。如果训练loss不降而验证集准确率也卡在个位数可以先跑几个batch做梯度检查看看反向传播的梯度是不是正常。曾经有一次我在项目里卡了两天最后发现是把数据集切错了训练集和验证集有大量重叠。这类低级错误排查起来最花时间但也是最容易忽略的。5.3 典型训练问题速查表现象可能原因排查方向loss不降或降得极慢学习率太小、数据未归一化检查初始学习率、预处理流程loss为NaN学习率过大、梯度爆炸降低学习率检查输入数据是否有极端值训练好但测试差过拟合加数据增强、正则化增加数据量准确率一直停留在一个奇怪水平数据集标签错误抽样检查数据标注质量微调预训练模型效果反而更差学习率过大将学习率调小10至50倍GPU显存不足批量大小或输入分辨率过高减小batch size降低图像尺寸开启混合精度关于显存不足还有一个容易被忽略的坑混合精度训练。现在的GPU都支持FP16和BF16计算显存占用几乎是半精度训练的一半速度还快不少。我在能支持的模型上基本都会开AMPO混合精度对精度影响很小显存压力却小很多。5.4 从分类到检测、分割CNN如何扩展CNN绝不是只能做图像分类。它作为特征提取器几乎能无缝嵌入所有视觉任务。目标检测里有R-CNN系列、YOLO、SSD它们是在CNN特征图上做区域提议或直接回归边界框和类别语义分割里有FCN、U-Net、DeepLab它们是在CNN的编码器下采样后再用上采样或者跳层结构把每个像素分类。这里的关键思路都是先用CNN的卷积层把图像变成特征再用不同任务头去解码这些特征。做目标检测时关注的常常是CNN的骨干网络。换一个更好的骨干比如从VGG换成ResNet50或EfficientNet检测精度会显著提升。做分割则要更注重空间信息的保留所以会用到特征金字塔、空洞卷积、跳连这些手段。理解了这个通用框架再去看Detectron2、MMDetection这些框架就会觉得清晰很多。5.5 3D CNN当数据多了一个维度最后说一下3D卷积神经网络因为热词里也有它而且3D CNN的理解路径跟2D是完全一致的。2D卷积处理的是二维图像输入是HxW卷积核在长宽两个方向滑动。3D卷积处理的是三维数据常见输入是DxHxW多了一个深度或时间维度。比如视频数据可以看成是连续帧堆叠起来的三维张量医学影像CT、MRI本身就是三维体数据点云处理后也能转成三维栅格。3D卷积核就不再是3x3的小方片而是3x3x3的小立方体在长宽高三个方向上滑动每个位置的输出值由一个小立体区域内的所有输入加权求和得到。3D CNN的典型代表是C3D模型它把视频理解任务直接出了一套卷积核为3x3x3的网络朴实地在时间维度上也滑起来。后来又有3D ResNet、R(21)D这些改进方法核心目标都是怎么在保持空间特征的同时把时间维度信息利用好。3D CNN的优势是能够同时捕捉空间结构和时序动态比如动作识别中“挥手”这个动作单帧只能看到手的空间位置多帧堆叠后能够学到时序上的变化模式。3D CNN最大的问题是参数量和计算量。输入张量多一个维度卷积核多一维特征图也多一维计算成本往往高出2D CNN一个数量级。实践里非常依赖GPU显存和视频抽帧策略。我见过一个视频理解项目原本2D模型能在普通显卡上跑到30fps换成3D模型直接掉到个位数帧率后来只能接受降低输入分辨率和帧率才勉强跑起来。如果不做视频理解或者三维医学数据处理入门阶段先把2D CNN吃透就够了。3D CNN的训练调参思路和2D基本一致额外要注意的就是数据输入的时间维度要不要做随机裁剪随机抽取一段连续帧以及帧之间的时间一致性处理。这些都对应着数据增强策略的扩展。6. 写在最后的一点经验我个人做了这么多图像项目之后最大的感受是CNN真正的门槛不在模型本身而在于你得想清楚每一层每个参数到底在干什么以及训练中每个异常背后可能对应什么原因。核心结构就那三块积木经典网络就那么几条演进脉络看得懂公式、跑得通代码再从一个小项目练起比如用ResNet做一个图像分类或者用U-Net做一个分割任务。练完一遍你对CNN基本就算“读过”而不是“背过”了。最后分享一个小技巧调试CNN的时候千万不要只盯着训练集准确率。每次训练完把验证集上预测错误的样本打印出来看一眼那种“人是上帝视角模型是像素视角”的差距会让你对模型能力有个清醒认识。这比任何理论分析都更管用。数据错了就改数据预处理错了就修预处理学习率不对就调学习率CNN在实际项目里很少需要你改网络结构更常见的问题是数据、预处理和超参。把这些基本功练扎实比什么都强。
返回列表