尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

卷积神经网络(CNN)18个核心概念大白话解读:从原理到实践

卷积神经网络(CNN)18个核心概念大白话解读:从原理到实践 1. 引言为什么我们需要“说人话”的CNN关键词解释如果你刚开始接触深度学习尤其是计算机视觉那么“卷积神经网络”这个词组可能既让你兴奋又让你头疼。兴奋的是它能让机器看懂图片、识别物体听起来非常酷。头疼的是翻开任何一本教材或技术博客迎面而来的就是“卷积核”、“池化”、“感受野”、“全连接层”等一系列专业术语每个词都认识但连在一起就不知道在说什么了。这种感觉就像面对一堵由专业黑话砌成的墙。我刚开始学CNN的时候也经历过这个阶段。当时我就在想有没有人能把这些高大上的词用我们平时聊天、打比方的方式讲清楚后来我发现真正理解一个概念不在于你能背出多复杂的定义而在于你能不能把它和一个你熟悉的东西联系起来。今天我就想当这个“翻译官”把CNN里最常见的18个关键词用最接地气的“大白话”给你捋一遍。我们不追求数学上的绝对严谨而是追求理解上的通透。当你下次再看到这些词时脑海里能立刻浮现出一个生动的画面而不是一堆冰冷的符号。这篇文章适合所有对AI感兴趣但被数学公式和术语吓退的朋友。无论你是想转行的程序员、相关专业的学生还是好奇的爱好者我们目标一致撕掉术语的神秘面纱看到CNN可爱又实用的一面。2. 核心基石图像是如何被“看懂”的在深入那些关键词之前我们必须先建立一个最基础的共识计算机是如何“看”一张图片的这对理解后续所有概念至关重要。对我们人类来说看一张猫的图片我们看到的是整体形态、毛色、眼睛。但对计算机而言它看到的只是一堆数字。一张彩色图片在计算机里通常被存储为一个三维数组或者叫“张量”。它的形状是[高度, 宽度, 通道数]。高度和宽度决定了图片有多少像素。比如一张224x224的图片就有50176个像素点。通道数对于最常见的RGB彩色图通道数是3分别代表红、绿、蓝三个颜色通道。每个像素点在这三个通道上各有一个0到255之间的数值这个数值组合起来就决定了这个像素点的颜色。如果是灰度图通道数就是1。所以计算机“眼里”的猫就是一个巨大的、充满数字的立方体。CNN要做的所有事情就是设计一套巧妙的流程从这个数字立方体里逐步提取出有用的信息比如边缘、纹理、部件、整体最终判断出“哦这是一只猫。”这个过程和我们自己认东西有异曲同工之妙。我们不会一眼就认出“猫”这个抽象概念而是先看到一些线条和色块边缘和颜色然后组合成耳朵、胡须、眼睛等局部特征最后大脑综合这些信息得出“猫”的结论。CNN正是模仿了这种从局部到全局的识别方式。注意这里说的“模仿”是非常粗略的类比。人脑的视觉皮层机制远比CNN复杂和精妙。但CNN的这种“局部连接”、“层次化提取”的思想确实是受神经科学的启发并且在工程上被证明极其有效。3. 网络结构三巨头卷积、池化与全连接CNN这个名字里的“卷积”已经点明了它的核心操作。但一个典型的CNN网络通常是由三种核心层像搭积木一样堆叠起来的卷积层、池化层和全连接层。理解了这三兄弟你就理解了CNN的骨架。3.1 卷积层拿着“小模板”在图片上“巡逻”的侦察兵这是CNN的灵魂操作也是最需要“翻译”的一个词。大白话解释想象你有一张很大的寻宝地图输入图片和一个画着特定图案的小透明塑料片卷积核也叫过滤器。你想知道地图上哪些地方有这个图案。你会怎么做你会把这个小塑料片盖在地图上的每一个可能的位置看看匹配度有多高。每盖一个位置你就计算一下塑料片下的图案和地图上对应位置的图案有多像然后得到一个“匹配分数”。这个“滑动、比对、打分”的过程就是卷积。卷积核/过滤器就是那个小塑料片。它本身也是一个小的数字矩阵比如3x3, 5x5。不同的卷积核负责检测不同的特征。有的专门找垂直的线条有的专门找45度的边缘有的专门找红色的区域。滑动与计算卷积核从图片的左上角开始每次向右或向下移动一定的步数这个步数叫步长。在每个停留的位置将卷积核上的数字与图片上对应区域的数字进行“对应位置相乘再求和”的运算。这个计算结果就是新图片特征图在该位置的一个像素值。特征图经过整个“巡逻”过程后你得到了一张新的“地图”。这张新地图上的每个像素值都代表了原图在对应位置与卷积核所寻找特征的匹配程度。高亮的地方就是特征出现的地方。一个卷积层通常会有多个卷积核比如32个、64个因此会产生多张特征图每一张都专注于一种特征。为什么这么做直接让计算机看整张图去认猫信息量太大且无关噪声多。卷积核通过关注局部小区域能够高效地提取出基础特征如边、角、点并且通过“权值共享”同一个卷积核扫遍全图极大地减少了需要学习的参数数量让网络更容易训练。3.2 池化层给特征图“瘦身”和“降噪”的压缩器卷积层会产生很多特征图而且尺寸可能还很大。池化层的作用就是对这些特征图进行“浓缩”保留最重要的信息去掉一些冗余的细节和噪声。大白话解释假设你有一张高分辨率的风景照片你想把它设置成手机壁纸但图片太大直接放上去会卡。你会怎么做你可能会缩小它或者只截取最重要的部分。池化干的就是类似“缩小”的活儿但更智能一些。最常见的池化方式是最大池化在一个小区域比如2x2的方块里只保留数值最大的那个像素。想象一下这个2x2区域里四个像素值分别代表该区域“猫耳朵特征”的强度。最大池化认为“只要有一个地方强烈显示有耳朵我就认为这个区域有耳朵特征。” 它保留了最显著的特征信号。作用一降低维度减少计算量。经过池化特征图的宽度和高度通常会减半如果使用2x2池化步长为2这大大减少了后续层需要处理的数据量让网络跑得更快。作用二引入平移不变性。猫的耳朵在图片中稍微移动几个像素对我们来说它还是耳朵。最大池化在一定程度上模拟了这种特性因为只要最强特征响应还在池化区域内输出就不会变。这提升了模型的鲁棒性。作用三防止过拟合。减少参数和计算量的同时也相当于一种正则化有助于模型学习更泛化的特征而不是死死记住训练图片的每一个像素。你可以把卷积层和池化层看作一个“特征提取流水线”卷积层负责“发现”特征池化层负责“精选”和“压缩”特征。这样的“卷积-池化”组合可以堆叠很多次让网络从浅层的简单特征边缘、颜色逐步组合成深层的复杂特征眼睛、轮子、门把手。3.3 全连接层做最终决策的“大脑委员会”经过好几轮的“卷积-池化”洗礼后我们得到了一组高度抽象化的特征图。但这些特征图还是二维的、网格状的数据。而我们的任务通常是分类比如判断是猫还是狗需要一个确定的类别输出。全连接层就是来完成这“临门一脚”的。大白话解释想象经过前面层层处理我们得到了关于这张图片的几百条高度精炼的“证据线索”例如“有尖耳朵特征值0.9”、“有胡须特征值0.8”、“有毛茸茸纹理特征值0.7”……。现在我们需要一个评审团来根据所有这些线索投票决定它到底是猫、狗还是汽车。全连接层就是这个评审团。它的每一个神经元都连接着上一层的所有输出所以叫“全连接”。它的工作就是学习如何给每一条“证据”分配合适的权重然后综合计算最终输出一个代表每个类别可能性的分数向量。扁平化在进入第一个全连接层之前需要把最后得到的那些二维特征图“拍扁”拉成一个很长的一维向量。这个过程叫扁平化。这就好比把评审团要看的几百条线索整理成一份长长的清单。权重与偏置全连接层的每个神经元都有自己的一套“评判标准”权重用来衡量每条线索的重要性。它还会有一个“初始倾向”偏置。最终它把所有线索的加权和加上偏置再通过一个激活函数如ReLU或Softmax产生输出。输出层最后一个全连接层通常就是输出层。对于十分类问题它就有10个神经元。每个神经元的输出值经过Softmax函数处理后就变成了该图片属于对应类别的概率。概率最高的那个就是网络的预测结果。所以CNN的典型流程可以概括为输入图片 - [卷积 - 激活 - 池化] x N - 扁平化 - 全连接层 x M - 输出类别概率。这个流程完美体现了“从局部到全局从具体到抽象”的特征提取思想。4. 让网络“活”起来的关键机制有了结构骨架网络还只是一堆静态的矩阵乘法。要让它们学会“看”还需要一些关键的动态机制。这些机制决定了网络如何学习、如何做出非线性判断以及如何避免“死记硬背”。4.1 激活函数神经网络的“开关”与“非线性魔法”如果只有卷积和全连接层的线性加权求和那么无论堆叠多少层整个网络本质上还是一个复杂的线性函数。而现实世界的数据和问题绝大多数都是非线性的。激活函数就是用来给网络引入非线性能力的“魔法调料”。大白话解释可以把神经元想象成一个微型决策器。它接收到所有输入信号加权求和后需要决定“我是否被激活”以及“我该发出多强的信号”。激活函数就是这个决策规则。Sigmoid/Tanh早期明星像一种“平滑的开关”能把输入压缩到(0,1)或(-1,1)之间。早期常用但有个大问题当输入值很大或很小时其梯度导数会变得非常小接近于0。在误差反向传播时梯度会层层衰减导致前面层的权重几乎得不到更新这个问题叫“梯度消失”。这就像水流到上游已经枯竭了所以现在深层网络里很少用在全连接层之间。ReLU整流线性单元当今霸主它的规则简单粗暴f(x) max(0, x)。如果输入是正数原样输出如果是负数输出0。你可以把它理解为一个“单向阀门”只让正信号通过负信号直接掐掉。优点计算极其简单就是一个max操作速度快。它在正数区域的梯度恒为1彻底解决了梯度消失问题在正数区域让深层网络训练成为可能。缺点“Dead ReLU”问题。如果一个神经元在训练过程中权重更新得不好导致它对所有训练数据的输入都是负数那么它将被永久关闭输出恒为0且梯度也为0再也无法被激活。就像一个坏掉的阀门再也打不开了。Leaky ReLU/ PReLU 等ReLU的改良版为了解决“Dead ReLU”问题Leaky ReLU给负数区域一个很小的斜率比如0.01而不是直接归零f(x) max(0.01x, x)。这样即使输入为负也有微小的梯度可以回流神经元“死而复生”的机会就大了很多。PReLU则把这个斜率也作为可学习的参数。在CNN中激活函数通常紧跟在卷积层或全连接层之后它决定了这一层提取的特征有多少、以何种强度传递到下一层。正是这些遍布网络的、非线性的“小开关”使得CNN能够拟合极其复杂的图像特征边界。4.2 损失函数衡量网络“错得多离谱”的标尺网络做出了预测比如“80%是猫15%是狗5%是汽车”但我们知道正确答案是“猫”。那么这个预测到底有多好或者多差损失函数就是用来量化这个“差距”的函数。大白话解释就像学生考试后老师要批改试卷打分。损失函数就是那个“评分标准”。分数越高损失值越大说明考得越差预测越不准。训练网络的目标就是想尽一切办法让这个“损失分数”降到最低。均方误差常用于回归问题预测一个连续值如房价。它计算预测值和真实值之差的平方的平均值。惩罚大的误差非常严厉因为平方。交叉熵损失这是分类任务尤其是图像分类的绝对主力。它衡量的是网络输出的概率分布与真实的“one-hot”分布正确答案类别为1其他为0之间的差异。直观理解假设正确答案是猫。网络给“猫”这个类别分配的概率越高交叉熵损失就越小。如果网络非常确信地预测了“狗”那么损失会非常大。它特别擅长处理概率输出并且梯度性质良好非常适合与Softmax输出层搭配使用。损失函数的值是后续优化器调整网络权重的唯一依据。可以说损失函数定义了网络学习的“目标”。4.3 优化器网络权重的“教练”与“导航仪”知道了“考了多少分”损失下一步就是“分析错题改进学习方案”也就是调整网络里成千上万个权重参数让下次“考得更好”。这个负责调整权重的算法就是优化器。大白话解释想象你在一片复杂的地形损失函数形成的“误差山地”里蒙着眼睛要找到最低的山谷最小损失点。优化器就是你的智能导航仪它根据你当前的位置和脚下的坡度梯度告诉你在每个参数上应该朝哪个方向、走多大一步。梯度下降最基础的想法。沿着当前点梯度的反方向最陡的下山方向走一步。步长由学习率这个超参数控制。问题如果学习率太大容易在山谷两边“震荡”甚至跳出去如果学习率太小下山速度太慢可能永远到不了谷底。而且它对所有参数都使用同一个学习率。SGD随机梯度下降及其变种不用全部数据算一次梯度再更新那太慢而是随机用一小批batch数据来计算一个“有噪声但快速”的梯度然后更新。这大大加快了训练速度并且噪声有时有助于跳出局部最优。Adam当前最流行的“全能型选手”可以理解为SGD的“豪华智能升级版”。它做了两件关键事动量不仅看当前梯度还考虑之前梯度的方向像有了“惯性”。这有助于在正确的方向上加速并减少震荡。自适应学习率为每个参数维护一个动态调整的学习率。对于频繁更新的参数梯度大给它小一点的学习率让它稳一点对于不常更新的参数给它大一点的学习率让它多走点。这就像给每个参数配了一个私人教练。优化器的选择和学习率的设置是训练深度学习模型时最需要“调参”的地方之一。一个好的优化器能让网络更快、更稳地收敛到一个好的结果。4.4 过拟合与正则化防止网络成为“死记硬背的书呆子”这是机器学习尤其是深度学习中的核心挑战。过拟合指的是模型在训练数据上表现极好甚至记住了每一个样本的噪声但在没见过的测试数据上表现很差。就像一个学生只背会了习题集的答案但没理解原理考试题目一变就不会了。大白话解释你的网络容量参数多少、层数深浅就像学生的大脑容量。如果容量太大而训练数据练习题有限它就有能力去记住训练数据中所有无关紧要的细节比如某张猫图片背景里有个污点而不是学习“猫”的通用特征。这就是过拟合。为了防止过拟合我们需要使用正则化技术给这个“过于聪明”的学生一些约束Dropout随机失活在训练过程中随机“关闭”网络中的一部分神经元比如每次以50%的概率让某个神经元输出为0。这听起来很暴力但效果奇佳。为什么有效这强迫网络不能过分依赖任何一个或一小部分神经元因为它在任何时候都可能被“下线”。网络必须学会让所有神经元都协同工作学习到更鲁棒、更分散的特征。这相当于让一群学生共同学习但每次随机抽走一部分人剩下的人必须能独立完成任务从而促进了知识的均衡掌握。在测试时所有神经元都参与工作但输出要乘以失活概率或做其他调整以保持期望值一致。L1/L2正则化在损失函数里额外加一项“惩罚项”。L2正则化惩罚大的权重值让权重趋向于小而分散L1正则化则倾向于让一些不重要的权重直接变成0产生稀疏性。这相当于告诉学生“别把某个知识点权重看得太重要均衡发展。”数据增强这不是直接对网络加约束而是“扩充练习题”。通过对训练图片进行随机旋转、裁剪、翻转、调整亮度对比度等操作人工制造出更多的、多样化的训练样本。这样即使网络想死记硬背它面对的“题目”也总是在变化它被迫去学习那些在各种变换下都不变的本质特征。这是计算机视觉领域最简单、最有效、成本最低的正则化手段之一。一个优秀的CNN模型往往是精巧的结构设计、合适的激活函数、定义明确的损失目标、高效的优化器以及防止过拟合的正则化技术共同作用的结果。5. 训练与评估让网络从“小白”变成“专家”有了结构、有了机制接下来就是“教”网络的过程。这个过程就是训练而我们需要一些方法来评估它学得怎么样。5.1 前向传播与反向传播网络学习的“教学循环”这是神经网络训练的核心算法一个紧密配合的“师生互动”过程。前向传播就是“学生做题”的过程。输入一张图片数据从输入层开始依次经过卷积、激活、池化、全连接等所有层最终得到预测输出。这个过程是沿着网络结构从前到后输入到输出计算一遍。反向传播就是“老师批改并讲解错题”的过程。当预测输出与真实标签通过损失函数计算出“错误分数”损失后这个误差信息需要从输出层开始一层一层地反向传递回网络的每一层。在传递过程中会利用链式法则计算出损失函数对于每一层每一个权重参数的梯度。这个梯度指明了“每个权重应该向哪个方向调整才能让总误差减小”。大白话解释想象教一个孩子认猫。你给他看一张猫的图片前向传播他说“这是狗”得到预测和损失。你告诉他“错了这是猫”计算损失。然后你不仅告诉他错了还会分析“你看这里明明是尖耳朵对应某个卷积核的权重你为什么认为是圆的下次看到尖耳朵要更重视一点。”反向传播计算梯度并更新对应权重。通过成千上万张图片的反复“做题-批改-讲解”网络里所有的权重参数就被逐渐调整到最佳状态。5.2 批量大小、迭代次数与周期训练不是一张图一张图地学而是分批进行的这里涉及几个关键概念批量大小每次前向/反向传播时一起送入网络的样本数量。比如批量大小为32就是一次用32张图来计算一个平均梯度然后更新一次权重。大的批量梯度估计更稳定训练更平滑对GPU等硬件利用率高。但需要更多内存且可能陷入尖锐的局部最优点。小的批量梯度估计有噪声这种噪声有时能帮助模型跳出局部最优找到更好的解。这就是所谓的“泛化能力更好”。但训练过程会更震荡。迭代次数完成一次权重更新即处理完一个批量称为一次迭代。周期整个训练集的所有样本都被网络看过一遍称为一个周期。通常需要很多个周期网络才能充分学习。5.3 准确率、精确率、召回率与F1分数多维度评价“专家”水平训练完后我们需要在独立的测试集上评估模型的性能。对于分类任务最直观的是准确率预测正确的样本数占总样本数的比例。但这有时不够。大白话场景假设我们有一个模型用来从1000张图片中找出“猫”正类其他都是“非猫”负类。模型预测了100张是猫其中90张确实是猫10张是狗误判。而在所有的猫里实际上共有120张猫模型只找出了其中的90张漏了30张。精确率模型说“是猫”的图片中到底有多少真的是猫90 / (9010) 90%。这衡量了模型的“判断严谨性”宁可错过也不错杀。召回率所有真正的猫模型找出来了多少90 / 120 75%。这衡量了模型的“查全能力”宁可错杀也不放过。F1分数精确率和召回率的调和平均数。当精确率和召回率都重要且需要找一个平衡点时F1分数是一个很好的综合指标。F1 2 * (精确率 * 召回率) / (精确率 召回率)。在猫狗分类这种类别均衡的任务中准确率很常用。但在诸如疾病检测正样本极少、垃圾邮件过滤等场景下精确率和召回率更能反映模型的真实能力。一个模型可能准确率很高比如99%但如果它把所有样本都预测为负类在疾病检测中就会漏掉所有病人召回率为0这是灾难性的。6. 现代CNN的进阶概念与架构思想随着CNN的发展研究者们提出了许多更精巧的结构和概念它们解决了基础CNN的一些痛点并大幅提升了性能。6.1 感受野神经元“看到”的原始图像范围这是一个非常重要的概念尤其在目标检测和语义分割中。感受野定义了特征图上的一个点对应到原始输入图像上的区域大小。大白话解释网络深层的某个神经元它之所以能响应“猫脸”这么复杂的特征是因为它“看到”了输入图像上足够大的一片区域。这个区域的大小就是它的感受野。你可以把它想象成一个不断扩大的“视野”。如何计算浅层的卷积核感受野很小比如3x3只能看到图像的局部边缘。随着层数加深通过卷积和池化的叠加后面层的神经元能“看到”的原始图像区域会越来越大。第二个卷积层的3x3卷积核作用在第一层特征图上而第一层特征图上的一个点已经包含了输入图像上3x3区域的信息所以第二层那个点的感受野可能就是5x5或7x7具体计算取决于步长、填充等。为什么重要为了检测大物体网络深层需要有很大的感受野。在图像分割任务中我们需要为每个像素分类就必须清楚网络在每一层、每个位置上的感受野以确保有足够的上下文信息来做判断。6.2 填充解决卷积的“缩水”问题如果你用一个3x3的卷积核步长为1去卷积一张5x5的图片不进行任何处理输出会变成3x3。每做一次卷积图像就缩小一圈。这对于深层的网络来说是个问题你可能不希望特征图尺寸变得太小。填充就是在输入图像的边缘外围补上一圈“像素”通常是0。这样卷积核在滑动到边缘时也有足够的区域进行计算从而可以保持输出特征图的尺寸与输入相同如果填充足够多。这被称为“相同填充”。保持尺寸不变便于我们设计和堆叠更深的网络。6.3 1x1卷积廉价的“特征通道调和器”初看1x1卷积很奇怪它不涉及任何空间信息因为只有1个像素宽高那它有什么用它的妙处在于操作通道维度。大白话解释假设上一层传来一个具有256个通道的特征图。1x1卷积的作用是让这256个通道的信息进行一次“投票”或“重新组合”生成新的、指定数量通道的特征图。降维/升维如果你想将256个通道减少到64个可以用64个1x1的卷积核。每个核在256个通道上做一次加权求和得到一个标量输出。这比用3x3卷积做降维要节省大量参数和计算量。跨通道信息交互它允许网络学习如何组合不同通道的特征。比如某些通道可能代表红色某些代表垂直边缘1x1卷积可以学习生成一个同时关注“红色垂直边缘”的新特征。引入非线性在1x1卷积后通常会接一个激活函数如ReLU这就在不改变空间尺寸的前提下增加了网络的非线性表达能力。在GoogleNet的Inception模块和ResNet中1x1卷积被大量使用以在增加网络深度的同时控制计算成本和参数量。6.4 残差连接与跳跃连接解决“深度诅咒”的妙招理论上网络越深能学到的特征越抽象表达能力越强。但实践中发现当网络深到一定程度比如超过20层性能不升反降。这不是过拟合而是退化问题深网络反而比浅网络更难训练误差更大。残差网络的提出完美地解决了这个问题。它的核心思想是跳跃连接不是让网络层直接学习目标特征H(x)而是让它们学习目标特征与输入之间的残差F(x) H(x) - x。然后通过一条“捷径”把输入x直接加到层的输出上输出 F(x) x。大白话解释假设你要学习一个非常复杂的映射。直接学可能很难。ResNet说“别直接学最终答案了你就学当前答案和最终答案的‘差距’残差就行了。然后我把你算出来的‘差距’加回到最初的起点上得到最终答案。” 如果某一层发现当前的F(x)学习效果不好比如梯度消失那么残差F(x)可以很容易地学习为0这样输出就退化成了输入x至少不会比浅层的网络更差。这条“捷径”保证了信息尤其是梯度能够畅通无阻地穿越非常深的网络使得训练上百层、甚至上千层的网络成为可能。6.5 批量归一化训练过程的“稳定器”深度网络训练非常困难一个主要原因是内部协变量偏移。简单说前面层的参数更新会导致后面层输入数据的分布发生剧烈变化。这要求后面的层需要不断去适应这种变化就像瞄准一个不断移动的靶子拖慢了训练速度。批量归一化在每个小批量数据通过某一层后对该层的输出进行归一化处理减去均值除以标准差将其强制拉回到均值为0、方差为1的标准正态分布。然后它又引入了两个可学习的参数缩放因子γ和平移因子β让网络自己决定是否恢复一些原有的分布特性。大白话好处允许使用更大的学习率因为数据分布稳定了不用担心梯度爆炸或消失。减少对初始化的依赖网络对初始权重的选择不那么敏感了。起到轻微的正则化效果因为每个批次的均值方差是估计值带来了轻微噪声。大幅加速训练收敛这是它最直接、最显著的效果。几乎成为现代深度网络的标准配置。在实践中BN层通常插入在卷积层或全连接层和激活函数之间。7. 从理论到实践一个简单的CNN代码框架理解了这么多概念最后我们用一个极其简化的伪代码框架来看看它们是如何组合在一起的。这里以PyTorch风格为例import torch import torch.nn as nn import torch.nn.functional as F class SimpleCNN(nn.Module): def __init__(self, num_classes10): super(SimpleCNN, self).__init__() # 特征提取部分卷积-激活-池化 堆叠 self.conv1 nn.Conv2d(3, 32, kernel_size3, padding1) # 输入3通道(RGB)输出32通道 self.bn1 nn.BatchNorm2d(32) # 批量归一化 self.pool nn.MaxPool2d(2, 2) # 2x2最大池化步长2 self.conv2 nn.Conv2d(32, 64, kernel_size3, padding1) self.bn2 nn.BatchNorm2d(64) # 全连接分类部分 self.fc1 nn.Linear(64 * 8 * 8, 512) # 假设经过两次池化后特征图尺寸为8x8 self.dropout nn.Dropout(0.5) # Dropout正则化 self.fc2 nn.Linear(512, num_classes) def forward(self, x): # 第一层块 x self.pool(F.relu(self.bn1(self.conv1(x)))) # Conv - BN - ReLU - Pool # 第二层块 x self.pool(F.relu(self.bn2(self.conv2(x)))) # 扁平化 x torch.flatten(x, 1) # 保持batch维度展平所有特征 # 全连接层 x F.relu(self.fc1(x)) x self.dropout(x) # 通常在全连接层后使用Dropout x self.fc2(x) # 输出层通常不加激活配合交叉熵损失使用 return x # 模型、损失函数、优化器实例化 model SimpleCNN(num_classes10) criterion nn.CrossEntropyLoss() # 交叉熵损失 optimizer torch.optim.Adam(model.parameters(), lr0.001) # Adam优化器 # 训练循环伪代码 for epoch in range(num_epochs): for images, labels in train_loader: # 从数据加载器获取一个批次 optimizer.zero_grad() # 清零梯度 outputs model(images) # 前向传播 loss criterion(outputs, labels) # 计算损失 loss.backward() # 反向传播计算梯度 optimizer.step() # 优化器更新权重 # 每个周期结束后可以在验证集上评估准确率等指标这个框架几乎包含了我们讨论的所有核心概念卷积层、池化层、全连接层、ReLU激活、批量归一化、Dropout、扁平化、交叉熵损失和Adam优化器。通过调整层数、通道数、添加更多技巧如残差连接就能构建出强大复杂的CNN模型去解决真实的图像问题。希望这18个关键词的“大白话”解读能帮你推开卷积神经网络的大门。记住理解的第一步是建立直观感受第二步才是深入数学细节。当你再看到这些术语时如果能联想到“巡逻的侦察兵”、“瘦身的压缩器”、“做决策的委员会”、“防死记硬背的随机点名”这些画面那么恭喜你你已经掌握了CNN最核心的思想精髓。剩下的就是在具体的项目和代码中去实践和体会了。
返回列表