尧图精选

卷积神经网络CNN核心原理与实战:结构图、经典模型及代码详解

🕒 发布时间:2026/10/1 1:39:25 📁 来源:尧图网络
说起卷积神经网络圈子里一般直接叫 CNN。搞过深度学习的人十有八九第一次感受到“神经网络原来真的能干活”就是从 CNN 开始的。它最经典的两个“名场面”一是手写数字识别二是 ImageNet 图像分类都是铺天盖地的结构图配一堆卷积、池化、全连接很多人第一眼看得头皮发麻其实拆开了看核心逻辑并不复杂。我这篇不打算堆公式而是从“为什么图像处理不用前馈神经网络”这个问题切入把 CNN 的结构图、核心原理、经典网络演进再到实际应用和动手搭建一条线串清楚。无论你是刚入门想搞懂结构图还是准备用 CNN 做图像分类、目标检测甚至想了解 3D 卷积、图卷积这些延伸方向的都能在这篇里找到可以直接上手的干货。1. 为什么图像处理不走全连接路线偏偏选CNN1.1 全连接网络在图像上的两个硬伤先看清楚 CNN 要解决的问题你才知道它的结构图为什么长这样。假设你有一张 32×32 的彩色图片输入就是 3×32×323072 个像素值。如果用一个最简单的全连接网络第一层放 1000 个神经元那这一层的权重数量就是 3072×1000约 300 万个参数。这还只是第一层图片稍微大一点比如 224×224 的普通照片输入就是 15 万个像素第一层接 1000 个神经元参数直接冲到 1.5 亿。网络还没开始学习显存先爆了。这是第一个硬伤参数爆炸。第二个硬伤更本质——全连接网络根本不理解图像的“空间结构”。你把一张猫的图片像素打乱成随机排列数值分布其实没变全连接网络照样能“拟合”但它学到的模式是像素位置的绝对依赖猫稍微往左平移两个像素网络可能就懵了。图像识别本质上是找局部纹理、边缘、形状这些特征这些特征在图片任何位置出现都应该被识别出来这叫平移不变性。全连接网络天生做不到这一点它每根权重只绑定一个固定位置的像素。所以你会看到如果直接用前馈神经网络去处理图像结果往往是参数巨大、训练极慢、泛化能力还很差。这不是调参能解决的问题是结构设计的问题。1.2 CNN的三大设计思想解决了什么CNN 的结构图里反复出现的卷积层、池化层背后其实只有三个核心思想理解了它们整张结构图就祛魅了。第一个叫局部连接。人看图片也不是一眼就把整张图所有像素同时看清楚的而是先看局部再看整体。卷积层就是干这个的一个卷积核只有 3×3 或 5×5 大小它每次只跟图片上一个小窗口做运算扫描完整张图。这样每个神经元只关注局部区域参数大大减少也更符合视觉系统的生物直觉。第二个叫权值共享。一个 3×3 的卷积核不管图片是 32×32 还是 1024×1024它都是同一组 9 个权重在图片各个位置滑动。这意味着无论特征出现在图片左下角还是右上角同一个卷积核都能检测到它。平移不变性就是这么来的权重数量也和输入图片尺寸无关只跟卷积核大小和数量有关这是结构图里卷积层参数远小于全连接层的原因。第三个是池化降采样。池化层做了一件很粗暴但有效的事把一个 2×2 或 3×3 区域里的值合并成一个值最常用的是取最大值。它带来两个好处一个是压缩了特征图的尺寸降低后续计算量另一个是让网络对微小的位移、缩放不那么敏感你稍微移动一下物体池化结果变化不大。这也就是为什么标准的 CNN 结构图里卷积层和池化层总是交替堆叠一个负责提取特征一个负责压缩特征。1.3 从特征提取角度看CNN如果从特征工程的角度看CNN 其实是一部“自动特征提取机器”。传统图像识别时代要靠人手工设计 SIFT、HOG、Haar 这些特征算子再配一个 SVM 分类器费时费力而且换一个场景就得重新设计。CNN 不需要你设计特征它的卷积核就是一组可学习的滤波器网络自己在训练过程中学会该提取什么。更有意思的是层级特征。浅层的卷积核学到的往往是边缘、颜色块、条纹这些低级特征中间层的卷积核开始组合出纹理、局部形状深层的卷积核能学到眼睛、轮子、窗户这类高层语义部件。这种从低级到高级的抽象过程和人类视觉皮层的处理方式高度相似。你去看任何一张经典的 CNN 结构图特征图从浅到深越来越“抽象”通道数越来越多空间尺寸越来越小这就是特征从像素到语义的演变过程。2. 一张CNN结构图到底怎么看2.1 标准结构图的五个组成块网上随便搜“卷积神经网络结构图”刷出来的图五花八门但仔细观察绝大多数都由五个基本模块组成输入层、卷积层、激活函数、池化层、全连接层。输出层一般就是全连接层加一个 Softmax做分类概率输出。输入层最好理解就是原始图像数据常见的格式是 高度×宽度×通道数比如 224×224×3。灰度图通道是 1RGB 图通道是 3如果是带透明通道的 PNG就是 4。结构图里输入层一般画成一个扁平的立方体标注好尺寸。卷积层是绝对的主角。它由若干个卷积核组成每个卷积核扫描输入特征图产生一张新的特征图。结构图里你看到的一堆叠在一起的“切片”就是多张特征图每个切片对应一个卷积核的输出。这里有个重点上一层的通道数等于下一层卷积核的通道数这一层的输出通道数等于卷积核的个数。比如输入是 RGB 三通道你用了 32 个 3×3 的卷积核输出就是 32 张特征图也就是 32 个通道。激活函数一般不单独画成一个层而是在结构图里用一个小标注放在卷积层后面最常见的是 ReLU。它的作用是引入非线性否则多层线性变换叠在一起数学上还是线性变换那网络再深也白搭。池化层在结构图里一般画成尺寸缩小一半的方块最常见的是 2×2 最大池化步长为 2效果就是宽度和高度各缩一半通道数不变。全连接层在结构图里通常画在最后前面所有特征图被拉平成一条长向量然后接几个全连接层最后输出类的概率分布。2.2 卷积层输出尺寸怎么算读结构图最关键的是看懂每一层数据的尺寸变化而尺寸变化的核心就是卷积输出尺寸公式。我先直接给你公式然后用人话解释输出尺寸 (输入尺寸 2×填充大小 - 卷积核大小) / 步长 1这里的填充叫 padding作用是在图片外围补一圈 0让边缘像素也能被卷积核有效地扫描到不然每次卷积完图片就缩一圈多叠加几层图就没了。步长叫 stride是卷积核每次滑动的距离。举个例子。输入 32×32用 3×3 卷积核padding1stride1那么输出尺寸 (322×1-3)/11 32尺寸不变。这就是结构图里最常见的“保持尺寸”配置。如果不用 padding同样是 3×3 卷积核stride1输出 (32-3)/11 30尺寸就缩小了 2。池化层的尺寸变化更简单一般用 2×2 池化、步长 2输出尺寸直接减半。32×32 经过一次池化就变 16×16再经过一次变 8×8。所以你在结构图里看到尺寸不断折半就是池化在起作用。参数数量也能算。一个卷积层的参数 (卷积核宽度 × 卷积核高度 × 上一层通道数 1 个偏置) × 本层卷积核数量。注意是“上一层通道数”而不是 1因为卷积核要同时对所有输入通道做加权和。比如上一层是 3 通道用 32 个 3×3 卷积核参数 (3×3×31)×32 896。2.3 激活函数与池化的位置和意义我见过不少初学者把结构图理解成“卷积-池化-卷积-池化”的固定套路其实激活函数就藏在卷积和池化之间这是有讲究的。标准顺序是卷积 - 批量归一化可能有- ReLU - 池化。激活函数放在池化之前是为了让特征在非线性变换之后再做降采样信息保留得更完整。激活函数的选择也有讲究。早期用得最多的是 sigmoid 和 tanh但这两个函数在输入绝对值大的时候梯度趋近于 0深层网络梯度一传就没了就是所谓的梯度消失问题。ReLU 在正区间梯度恒为 1负区间输出为 0既缓解梯度消失又带来稀疏性计算还快所以它成了 CNN 的标配。实践中你还会遇到 LeakyReLU、ELU 这些变体主要是想解决 ReLU 把负值直接置 0 导致神经元“死亡”的问题但在大多数标准任务里普通 ReLU 已经够用。池化的位置一般在一个或多个卷积层之后。为什么不是每次卷积完都池化因为池化虽然能降维但也会损失信息池化太频繁会让特征图太小特征提取得不够充分。常见的做法是连续两三个卷积层提取特征再做一次池化压缩。结构图里那种“卷积块 池化”的节奏其实就是在平衡特征表达能力和计算开销。3. 经典结构图拆解LeNet-5与现代变体3.1 LeNet-5逐层参数表说到 CNN 结构图LeNet-5 是绕不开的祖师爷。1998 年 Yann LeCun 等人设计的它最初就是用来做手写数字识别也是你能找到的最小、最适合逐层拆解的经典结构。它的完整结构是输入 - 卷积 - 池化 - 卷积 - 池化 - 全连接 - 全连接 - 输出。我直接给你整理成参数表你照着画结构图就能画出来层名称核大小输出尺寸输出通道数参数量输入层-32×321-卷积层C15×5stride1无padding28×286(5×5×11)×6156池化层S22×2stride214×146无参数卷积层C35×5stride110×1016(5×5×61)×162416池化层S42×2stride25×516无参数全连接层C5-1201(5×5×161)×12048120全连接层F6-841(1201)×8410164输出层-101(841)×10850逐层看参数量大头其实在最后三个全连接层加起来约 6 万个前面的卷积层总共才 2500 多个参数。这个现象在早期 CNN 里很典型卷积层负责提取特征全连接层负责分类决策。这里有个细节提一下C3 层在原始论文里并不是每个卷积核都和上一层全部 6 个通道相连而是一种对称连接策略目的是打破对称性、控制连接数量。但后来实践发现直接全连接效果更好也更简单所以现代实现基本都是全连接方式你按参数表里的全连接方式算就行。3.2 从LeNet到ResNet结构设计演进LeNet-5 确定了 CNN 的基本范式但它的结构图比较简单只有 7 层。2012 年的 AlexNet 把这个范式放大了一倍多8 层结构用了 ReLU、Dropout、数据增强一举拿下 ImageNet 冠军把深度学习重新带回主流视野。再往后就是两个重要演进方向。一个是“更深”代表作是 VGG它做了一个极简的约定全部用 3×3 卷积和 2×2 池化。VGG 的结构图非常工整3×3 卷积堆叠若干次然后池化减半通道数翻倍从 64 到 128 到 256 到 512全是这个节奏。它的逻辑很清晰两个 3×3 卷积堆叠感受野等于一个 5×5 卷积参数却是 2×918 个对 25 个参数更少非线性更强。另一个是“跨层连接”代表作是 ResNet。ResNet 的发现很反直觉网络到了一定深度再加深训练误差反而上涨这叫退化问题。于是何恺明团队引入残差块让输入直接跨越一两层加到输出上结构图里表现为一条从旁边“抄近道”的线。这条线非常关键它让梯度可以不走卷积路径直接回传解决了深层网络难训练的问题使得几百层的网络成为可能。现代结构图的演进本质就是在回答一个问题同样的参数预算怎么让信息流动得更好让特征表达得更高效。你看 DenseNet 把每层和所有后续层都连起来看 SENet 在通道上加注意力看 Transformer 架构的 ViT 干脆把图片切成 patch 再做自注意力都是从不同角度往这个方向使劲。但无论怎么变底层的卷积、池化、全连接这些基础模块的原理你掌握了就一通百通。4. CNN到底能用在哪些地方4.1 图像之外的二维应用既然 CNN 是为图像设计的最常见的应用当然还是图像领域的三大任务图像分类、目标检测、图像分割。图像分类最简单一个 CNN 骨干网络加一个分类头就行典型代表就是 ResNet 之类的结构图。目标检测则在分类基础上多了一步定位用矩形框标出物体位置典型代表是两阶段的 Faster R-CNN 和单阶段的 YOLO 系列。图像分割更细要做像素级分类代表方法是 FCN 和 U-Net。但这些还只是冰山一角。CNN 处理的是“具有网格结构的数据”只要能排列成规则网格都能尝试用 CNN。语音数据可以看成 时间×频率 的二维网格所以语音识别里经常用二维卷积。自然语言处理里文本可以做词嵌入后形成一个 序列长度×向量维度 的矩阵用一维卷积提取局部 n-gram 特征TextCNN 就是这类代表。搜索引擎和推荐系统里也有把用户行为序列建模后用卷积做特征提取的做法只是不像图像领域那么出名。商业应用里OCR 文字识别、人脸识别与活体检测、工业质检的缺陷检测、医学影像的病灶识别全部是 CNN 在撑腰。就连手机相册里按人脸聚类分组的功能底层也是先靠 CNN 做人脸检测再把检测到的人脸区域提特征向量做对比。4.2 3D卷积与时空建模标准 CNN 是二维卷积处理静态图像。但视频多了一个时间维度医学 CT 和 MRI 有空间的三维结构这时候 2D 卷积就力不从心了需要上 3D 卷积。3D 卷积的输入是一个五维张量格式一般是 批次×通道数×深度×高度×宽度。深度在视频里对应时间帧数在医学影像里对应切片数量。3D 卷积核是一个立方体扫描时同时沿宽度、高度、深度三个方向滑动每个位置计算一次加权和。你可以把 3D 卷积理解为 2D 卷积在三个方向上的推广权值共享方式不变局部连接思想也不变。3D CNN 最常见的应用是视频行为识别比如要判断一段视频里人在跑步还是挥手不能只看单帧得看连续几帧里的动态变化。典型网络有 C3D、I3D。医学影像方面肺结节检测、脑肿瘤分割这类任务需要同时看多个切片才知道病灶的空间形态3D U-Net 是这类任务里的主力。我自己试过用 3D CNN 处理脑部 MRI 数据说实话显存消耗非常凶一个 64×64×64 的输入块模型稍微深一点消费级显卡基本扛不住两三个 batch工程上一般会先用 2D 预训练模型再扩展到 3D 微调或者用伪 3D 的分解方式节省算力。4.3 结构化的图卷积网络图卷积神经网络是热词里另外一个让人望而生畏的方向其实思路也很清晰。标准 CNN 处理的是欧几里得空间里的网格数据但现实世界大量的数据是图结构比如社交网络里的用户关系、分子里的原子连接、引文网络里的论文关系。这些数据没有左上到右下的排列顺序节点之间的关系是一张网普通卷积没法定义“卷积核滑动”。图卷积网络的核心是把卷积操作推广到图上。它的思想是一个节点的特征通过聚合它邻居节点的信息来更新。每一层图卷积节点都在“跟邻居交换信息”多层堆叠后每个节点就能感知到多跳范围内的信息。最基础的 GCN 公式不复杂核心就是归一化邻接矩阵乘以特征矩阵再乘以可学习的权重矩阵经过激活函数输出。说起来抽象但你看懂公式里的“聚合邻居”这层含义就抓住了本质。图卷积的应用也很贴近商业社交推荐系统建模用户与商品的关系、风控场景建模资金流向网络、制药行业预测分子性质、知识图谱补全推理。不过我要提醒一句如果你的数据真的是规则的图像或表格数据别为了用 GCN 而用 GCN它只有在数据本身是图结构时才比普通 CNN 或 MLP 有优势强行套用反而会损失性能。5. 从零搭建并画出自己的CNN5.1 用PyTorch实现一个CIFAR-10分类器理论说再多不如亲手搭一个。下面这个例子是用 PyTorch 实现的一个标准 CNN数据集用 CIFAR-10输入是 32×32 的彩色图一共 10 个类别。我把每一层的尺寸变化都写在注释里方便你对照结构图理解。import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms class SimpleCNN(nn.Module): def __init__(self, num_classes10): super(SimpleCNN, self).__init__() # 输入: (3, 32, 32) self.conv_block1 nn.Sequential( nn.Conv2d(3, 32, kernel_size3, padding1), # (32, 32, 32) nn.BatchNorm2d(32), nn.ReLU(inplaceTrue), nn.Conv2d(32, 32, kernel_size3, padding1), # (32, 32, 32) nn.BatchNorm2d(32), nn.ReLU(inplaceTrue), nn.MaxPool2d(kernel_size2, stride2) # (32, 16, 16) ) self.conv_block2 nn.Sequential( nn.Conv2d(32, 64, kernel_size3, padding1), # (64, 16, 16) nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.Conv2d(64, 64, kernel_size3, padding1), # (64, 16, 16) nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.MaxPool2d(kernel_size2, stride2) # (64, 8, 8) ) self.classifier nn.Sequential( nn.Flatten(), nn.Linear(64 * 8 * 8, 256), # 64*8*84096 nn.ReLU(inplaceTrue), nn.Dropout(0.5), nn.Linear(256, num_classes) ) def forward(self, x): x self.conv_block1(x) x self.conv_block2(x) x self.classifier(x) return x model SimpleCNN() print(model)批归一化层我建议尽量加上。它把每一层的输入分布重新拉回标准正态分布附近训练会稳定非常多对学习率也没有那么敏感。在深层网络里批归一化几乎是必备组件LeNet 时代没这个技巧所以训练很费劲现代结构图里 BN 层已经和卷积层深度绑定。全连接层前面的 Flatten 是关键节点它把 64×8×8 的三维特征图拉平成 4096 维的向量。这个 8×8 怎么来的输入 32×32经过第一个池化减半变 16×16再经过第二个池化变 8×8通道数是 64所以拉平后就是 64×8×84096。凡是结构图里全连接层和卷积层衔接处的尺寸对不上基本都是这一步没算对。5.2 训练配置和参数选择模型写好了训练配置也有不少门道。以下是我常用的配置直接参照即可transform_train transforms.Compose([ transforms.RandomCrop(32, padding4), # 随机裁剪相当于平移增强 transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616)) # CIFAR-10 数据集均值标准差 ]) transform_test transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616)) ]) train_dataset torchvision.datasets.CIFAR10( root./data, trainTrue, downloadTrue, transformtransform_train) test_dataset torchvision.datasets.CIFAR10( root./data, trainFalse, downloadTrue, transformtransform_test) train_loader torch.utils.data.DataLoader( train_dataset, batch_size64, shuffleTrue, num_workers2) test_loader torch.utils.data.DataLoader( test_dataset, batch_size64, shuffleFalse, num_workers2) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) scheduler optim.lr_scheduler.StepLR(optimizer, step_size10, gamma0.1) for epoch in range(20): model.train() running_loss 0.0 for images, labels in train_loader: optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() scheduler.step() print(fEpoch {epoch1}, Loss: {running_loss / len(train_loader):.4f})里面几个细节值得展开说。数据增强用随机裁剪加水平翻转在 CIFAR-10 上基本是标准配置同等结构下能提升好几个点准确率因为图片数量相当于乘以几十倍。Adam 优化器对新手最友好SGD 配动量调得好上限更高但需要更多调节经验选型上没有绝对的对错先跑通再优化更实际。学习率 0.001 是一个相对保守的起点配合 StepLR 每 10 个 epoch 缩小到原来的十分之一训练后期用更小的步长做精细调整这种动态学习率策略在 Adam 里同样有效。我在本地跑这个模型CPU 上大约 20 分钟左右就能跑完 20 个 epoch测试集准确率能做到 75% 左右如果加大训练轮次到 40 轮可以到 80% 以上换成 ResNet 结构还能再往上推。这个精度在 CIFAR-10 上不算高但作为理解 CNN 结构和训练流程的练手项目信息量已经非常足够。5.3 结构图绘制工具推荐写代码只是第一步很多时候你需要把网络结构画出来写论文、做汇报、写博客都用得上。这里分享几个我实测过比较顺手的工具。NN-SVG 是最适合快速画结构图的在线工具打开网页就能用提供了 FCNN、LeNet、AlexNet 三种预设模板可以调卷积核数量、特征图尺寸、配色导出 SVG 或 PNG。它当年在我写课程报告时帮了大忙出来就是论文风格的图不用自己排版。缺点是比较死板复杂到 ResNet 那种带跨层连接的结构它就画不了了。draw.io 是万金油解决方案免费开源里面的图形库可以拖拽出方块、箭头、立方体适合画自定义的结构图比如你要突出某个模块的设计、画数据流向。我把画结构图的经验总结成三步第一步先用表格把各层输入输出尺寸、核大小、步长列清楚第二步按“左到右或下到上”的流向把基本模块摆出来第三步用不同颜色区分卷积、池化、全连接。颜色区分非常重要观众扫一眼就能从视觉上定位不同层。如果你追求论文级的绘图效果用 PlotNeuralNet 这个 LaTeX 工具它生成的图那种立体层叠质感和顶会论文里的一模一样。缺点是配置成本高需要装 LaTeX 环境平时不写论文的话性价比不高。6. 常见问题与排查实录6.1 五个高频翻车现场我在带人入门和平时自己调试时遇到过不少重复率极高的问题整理成一张速查表你遇到类似情况可以直接对照。现象可能原因解决办法Loss 一开始很高且不下降学习率过大导致震荡或输入数据没做归一化把学习率降到 0.0001 试跑几十个 batch确认数据归一化范围训练集准确率高测试集准确率低模型过拟合加数据增强、Dropout或者减小模型容量早停全连接层输入维度报错池化后的特征图尺寸算错了打印 x.shape 逐步确认或按公式逐层手算训练过程 Loss 剧烈波动batch size 太小或者学习率过大增大 batch size或降低学习率配合学习率衰减卷积层用 ReLU 后大量输出为 0学习率太大导致神经元死亡降低学习率考虑换 LeakyReLU这里我要单独强调过拟合。CIFAR-10 有 5 万张训练图已经不算小数据了但 20 个 epoch 之后如果你不加任何正则化测试集准确率反而可能下降原因就是模型把训练集的噪声也背下来了。Dropout 加在全连接层前很有效用 0.5 的比率在 CIFAR-10 上能明显缓解过拟合BatchNorm 本身也有正则化效果两者配合是当前最常见的组合。显存不足也是个高频问题。我在 4GB 显存的卡上跑 3D CNN 经常被 OOM 打断解决思路有三个把 batch size 调到最小 1先确认模型本身能跑通把输入图片尺寸调小一半比如 224 降到 112显存占用会降到原来的四分之一最后一个办法是启用梯度累积用小 batch 模拟大 batch 的效果代码上每过几个 batch 再做一次 optimizer.step()。6.2 几条越早知道越好的经验调了这么久的 CNN有几句踩坑换来的体会对你应该有参考价值。第一结构设计永远是先算清楚再写代码。我见过太多人改改网络结构就跑结果报维度错误回头一层层查。其实在写 nn.Sequential 之前拿笔在草稿纸上按输入尺寸推一遍每一层的输出尺寸两分钟的事能帮你省掉一小时的调试时间。推荐一个技巧在 forward 里临时打印 x.shape比人肉算快得多尤其适合结构比较深的网络。第二在跑大数据集之前先在几十张图上做“过拟合测试”。选少量训练样本比如 50 张把模型在这个小集上训练几个 epoch如果 Loss 能降到接近 0 或者准确率打满说明模型本身能学习问题出在数据层面如果小样本都学不动那模型结构或优化器肯定有问题趁早改。这个习惯我保持了很久屡试不爽。第三学习率的初始值值得专门实验几回。很多人习惯默认 0.001 跑到底但不同的数据集、网络深度、batch size最优学习率能差一个数量级。一个简单粗暴的判断方法训练的前几十个 batch如果 Loss 一路平稳不降把学习率乘以 10 再试如果 Loss 直接飞掉把学习率除以 10。多调几次你会慢慢培养出对 Loss 曲线的直觉。第四学会看结构图背后的计算复杂度不要盲目加深加宽。我见过有人把 VGG 的通道数全部翻倍去跑一个小数据集结果不仅没变准反而更容易过拟合训练时间也翻了几倍。判断一个结构适不适合你的任务不光看参数量还要看数据集规模。数据量小就克制一点先用一个简单基线模型跑通再逐步加复杂度每一步都确认收益是正的。我在实际使用中最大的体会是CNN 结构图看着复杂但真正用的核心模块就那么几个。一张图能不能读懂取决于你脑子里有没有那套尺寸计算方法和模块定位。只要把局部连接、权值共享、层次化特征提取这几件事想透了再去看 ResNet、Faster R-CNN、U-Net 这些结构图会发现它们都是在同一个骨架上做文章。写文章的最后再送你一个小习惯每次拿到一张别人的结构图先自己推一遍每层输出尺寸然后用 NN-SVG 复刻出来两张放一起对比。这个练习做多了CNN 对你来说就没什么秘密了。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →