【深度学习】CNN(卷积神经网络)从零开始教程
写在前面这篇文档不假设你有任何 CNN 基础。我们会从人眼怎么看图片出发一步一步引出 CNN 的每个核心概念让你读完后能说清楚卷积在干什么、为什么要池化、BatchNorm 有什么用、Dropout 怎么防过拟合、整个网络是怎么把一张图变成一个分类结果的。第一章 从人眼说起——为什么需要 CNN1.1 人是怎么认出一只猫的你看到一张猫的照片大脑不会一个像素一个像素地扫描。你的视觉系统是这样工作的先看局部这里有个尖尖的轮廓耳朵、这里有一团柔和的纹理毛发、这里有两个圆形高光眼睛再组合尖耳朵 圆眼睛 胡须 猫脸最后判断这是一只猫这个过程的关键词是局部特征 → 组合 → 判断。1.2 MLP 为什么不擅长看图MLP全连接网络处理图片的方式是先把整张图拍成一条长长的数字串然后一股脑全部连接。问题在于它不知道哪些像素是邻居。左上角的像素和右下角的像素在拍平后的向量里可能离得很远也可能离得很近完全取决于拍平顺序它没有局部的概念。不会先看耳朵再看眼睛而是试图从 3072 个数字里直接找规律参数爆炸。一张 32×32×3 的图拍平就有 3072 个输入如果下一层有 1024 个神经元光这一层就有 3072×1024 ≈ 300 万个参数1.3 CNN 的核心思想CNN 的设计哲学直接模仿了人眼的工作方式用小窗口扫描卷积→ 提取局部特征逐层抽象多层卷积 池化→ 从边缘 → 纹理 → 部件 → 整体最后做判断全连接层→ 输出分类结果下面我们逐一拆解。1.4 一句话总结CNN 本质上就是一条流水线卷积看局部 → 池化缩尺寸 → 逐层叠加从低级到高级 → 全连接做决策。整个过程是监督学习——每张图都有标签模型对着标签学。它需要的全部组件可以用一张表概括组件做什么在流水线里的位置卷积Conv用小窗口提取局部特征前面反复出现ReLU把负数归零引入非线性每次卷积之后BatchNorm校准数据分布稳定训练卷积和 ReLU 之间池化MaxPool缩小尺寸保留关键信息每个阶段末尾Dropout随机关闭神经元防过拟合池化之后或全连接层之间全连接层Linear综合所有特征输出分类得分最后交叉熵损失衡量预测和标签的差距训练时计算优化器SGD/Adam根据梯度更新参数每步训练后面的章节会逐个讲清楚每个组件的原理。第二章 卷积Convolution——CNN 的灵魂2.1 什么是卷积核想象你有一个3×3 的小方格里面填了 9 个数字。这就是一个卷积核也叫滤波器/filter。卷积核示例边缘检测 ┌────┬────┬────┐ │ -1 │ -1 │ -1 │ ├────┼────┼────┤ │ -1 │ 8 │ -1 │ ├────┼────┼────┤ │ -1 │ -1 │ -1 │ └────┴────┴────┘2.2 卷积运算的过程把这个 3×3 的小窗口放在图片的左上角窗口覆盖了图片的 3×3 区域。然后把窗口里的 9 个像素值和卷积核里的 9 个数字对应位置相乘把 9 个乘积加起来得到一个数把这个数写到输出图的对应位置然后窗口往右移一格重复上述过程。移到头了就换下一行。这样扫完整张图就得到了一张新的特征图。输入图片5×5 卷积核3×3 输出特征图3×3 ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┐ │ 1 │ 2 │ 3 │ 0 │ 1 │ ┌───┬───┬───┐ │ │ │ │ ├───┼───┼───┼───┼───┤ │ 1 │ 0 │-1 │ ├───┼───┼───┤ │ 0 │ 1 │ 2 │ 3 │ 0 │ × │ 1 │ 0 │-1 │ → │ │ │ │ ├───┼───┼───┼───┼───┤ │ 1 │ 0 │-1 │ ├───┼───┼───┤ │ 1 │ 0 │ 1 │ 2 │ 1 │ └───┴───┴───┘ │ │ │ │ ├───┼───┼───┼───┼───┤ └───┴───┴───┘ │ 2 │ 1 │ 0 │ 1 │ 0 │ ├───┼───┼───┼───┼───┤ │ 0 │ 1 │ 2 │ 1 │ 1 │ └───┴───┴───┴───┴───┘2.3 卷积能检测什么不同的卷积核能检测不同的模式卷积核类型能检测到的内容直觉理解横向边缘核水平方向的边界像用手指横着划过图片能感受到上下颜色变化纵向边缘核垂直方向的边界像用手指竖着划模糊核平滑区域像隔着磨砂玻璃看关键点在 CNN 里卷积核的数值不是人工设计的而是训练出来的。网络会自动学习什么样的卷积核对分类最有帮助。2.4 通道Channel彩色图片有 3 个通道R、G、B。卷积核也必须是 3 个通道的——实际上是一个3×3×3的小方块。但我们通常不只用一个卷积核而是同时用很多个。比如Conv2d(3, 64, kernel_size3)的意思是输入有 3 个通道同时使用64 个不同的卷积核每个卷积核扫一遍图片产生一张特征图64 个卷积核就产生64 张特征图堆在一起形成 64 个通道的输出你可以理解为64 个观察员从 64 种不同的角度去看同一张图片有的专门看边缘有的专门看颜色变化有的专门看纹理。2.5 padding填充卷积核在图片上滑动时边缘位置是覆盖不全的。什么意思看这张图5×5 图片中每个像素被 3×3 卷积核覆盖的次数 ┌───┬───┬───┬───┬───┐ │ 1 │ 2 │ 3 │ 2 │ 1 │ ← 角落只被扫到 1 次 ├───┼───┼───┼───┼───┤ │ 2 │ 4 │ 6 │ 4 │ 2 │ ├───┼───┼───┼───┼───┤ │ 3 │ 6 │ 9 │ 6 │ 3 │ ← 中心被扫到 9 次 ├───┼───┼───┼───┼───┤ │ 2 │ 4 │ 6 │ 4 │ 2 │ ├───┼───┼───┼───┼───┤ │ 1 │ 2 │ 3 │ 2 │ 1 │ └───┴───┴───┴───┴───┘原因很简单卷积核必须完整地落在图片里面才能计算。角落像素只有一种摆法——核贴着角放而中心像素周围空间充足核可以在 9 个位置覆盖到它。边缘像素参与计算的次数少信息提取不充分而且输出尺寸也会缩小5×5 输入经 3×3 核卷积后只剩 3×3。通用公式输出尺寸 输入尺寸 − 卷积核尺寸 1 5 − 3 1 3padding 怎么解决这个问题padding1的意思是在图片四周补一圈 0零填充让输入从 5×5 变成 7×7这样卷积后输出尺寸就和原来一样大了。原始输入5×5 补零后7×7 ■ ■ ■ ■ ■ 0 0 0 0 0 0 0 ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ → 0 ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ 0 0 ■ ■ ■ ■ ■ 0 0 0 0 0 0 0 0 补零后用 3×3 核卷积输出 7 − 3 1 5×5 ✓ 尺寸不变加了 padding 后的通用公式输出尺寸输入尺寸2×padding−卷积核尺寸1\text{输出尺寸} \text{输入尺寸} 2 \times \text{padding} - \text{卷积核尺寸} 1输出尺寸输入尺寸2×padding−卷积核尺寸1对于 3×3 的核padding1 刚好让输出 输入。对于 5×5 的核需要 padding2。规律就是padding (核尺寸 − 1) / 2。补的 0 不会污染特征吗实际上影响很小——边缘的 0 只参与最外圈的卷积计算而且网络会自动学会忽略这些零值。这样就不会因为卷积操作而不断缩小图片了。2.6 stride步长默认情况下卷积核每次移动一格stride1。如果设 stride2就每次跳两格输出尺寸会减半。本项目里卷积层都用 stride1尺寸缩减交给池化层来做。第三章 激活函数 ReLU——给网络注入非线性3.1 为什么需要激活函数假设没有激活函数网络里全是线性运算矩阵乘法 加法。不管你叠多少层输出W3⋅(W2⋅(W1⋅x))(W3⋅W2⋅W1)⋅xW′⋅x\text{输出} W_3 \cdot (W_2 \cdot (W_1 \cdot x)) (W_3 \cdot W_2 \cdot W_1) \cdot x W \cdot x输出W3⋅(W2⋅(W1⋅x))(W3⋅W2⋅W1)⋅xW′⋅x多层线性变换等于一层线性变换。这意味着网络再深也只能画直线无法学会复杂的弯弯曲曲的分类边界。3.2 ReLU 是什么ReLURectified Linear Unit是最简单也是最常用的激活函数ReLU(x)max(0,x)\text{ReLU}(x) \max(0, x)ReLU(x)max(0,x)输入是正数 → 原样输出输入是负数 → 变成 0输入: [-2, 3, -0.5, 7, -1, 0] ReLU: [ 0, 3, 0, 7, 0, 0]3.3 为什么要把负数归 0这是理解 ReLU 最关键的一个问题。答案有三层第一负数代表没匹配到的信号。卷积核在扫描图片时如果某个区域不匹配它要检测的模式比如一个边缘检测核扫到了一片平坦区域输出就是负数。负数的含义是这里没有我要找的东西。ReLU 把它归 0就是在说没找到就是没找到不保留这个无关信号。第二制造稀疏性。归 0 之后网络中大量神经元的输出变成了 0——只有少部分被激活。这类似于人脑的工作方式看到一张猫的图片只有负责识别尖耳朵“胡须”毛发纹理的神经元会兴奋其余保持沉默。这种稀疏激活让网络更高效、更不容易过拟合。第三这是引入非线性的最简单方式。正数区间是直线零点处有一个拐角这就打破了线性。比 sigmoid 之类的函数计算快得多梯度也不会消失。3.4 为什么 ReLU 这么受欢迎优点解释计算快只是比较大小比 sigmoid、tanh 等函数快得多梯度不会消失正数区域梯度恒为 1不会越乘越小深层网络的大问题稀疏激活负数变 0 后网络中只有部分神经元被激活类似于大脑的工作方式一句话总结ReLU 就是给网络装了一个开关——每个神经元要么全力输出正数要么彻底关闭负数变 0让网络有了区分复杂模式的能力。第四章 池化Pooling——聪明地缩小图片4.1 为什么要池化经过卷积后特征图可能还是很大比如 32×3264 个通道。如果直接堆更多卷积层计算量会非常大。池化的作用缩小尺寸减少计算量和参数量提取显著特征只保留最重要的信息增加平移不变性即使目标在图片里稍微移动了位置池化后的结果也差不多4.2 最大池化MaxPool本项目用的是MaxPool2d(kernel_size2)意思是把特征图划分成 2×2 的小格子每个格子里取最大值输出尺寸变为原来的一半输入4×4 输出2×2 ┌────┬────┬────┬────┐ ┌────┬────┐ │ 1 │ 3 │ 2 │ 4 │ │ 3 │ 4 │ 取左上 2×2 的最大值 3右上的最大值 4 ├────┼────┼────┼────┤ ├────┼────┤ │ 5 │ 2 │ 1 │ 0 │ → │ 5 │ 3 │ 取左下 2×2 的最大值 5右下的最大值 3 ├────┼────┼────┼────┤ └────┴────┘ │ 0 │ 1 │ 3 │ 2 │ ├────┼────┼────┼────┤ │ 4 │ 2 │ 1 │ 3 │ └────┴────┴────┴────┘4.3 为什么取最大值而不是平均值最大池化保留的是最强烈的响应。比如某个卷积核是边缘检测器那么 2×2 区域里最大的那个值就代表这个区域里最明显的边缘强度。微弱的信号小值可能只是噪声丢掉也无妨。当然也有平均池化AvgPool取的是平均值保留的是区域的整体感觉。两种各有适用场景但在分类任务里最大池化更常用。4.4 池化后尺寸怎么变本项目中图片尺寸的变化过程输入: 32×32 ↓ 第一次 MaxPool(2) 16×16 ↓ 第二次 MaxPool(2) 8×8 ↓ 第三次 MaxPool(2) 4×4三次池化尺寸缩了 8 倍32 → 4但通道数从 3 涨到了 256。空间信息换成了语义信息——图变小了但每个位置包含的含义更丰富了。3 个通道和256 个通道是完全不同的概念最初的 3 个通道就是 RGB 三个颜色层——红、绿、蓝这是人类定义的每个通道只记录一种颜色的亮度。后面涨到 64、128、256 个通道含义完全不同——每个通道是一个卷积核扫描出来的特征图。比如第一层Conv2d(3, 64)有 64 个卷积核训练后每个核学会检测一种模式第 1 个核 → 检测水平边缘 → 产出第 1 张特征图 第 2 个核 → 检测垂直边缘 → 产出第 2 张特征图 第 3 个核 → 检测红色色块 → 产出第 3 张特征图 ... 第 64 个核 → 检测对角线纹理 → 产出第 64 张特征图 64 张特征图堆在一起 64 个通道到了第二层Conv2d(64, 128)128 个核在这 64 张特征图上做组合——比如水平边缘 垂直边缘 角落又产出 128 张更高级的特征图。为什么越深通道越多浅层检测的是边缘、颜色这类简单模式几十种就够了。但深层要表达猫耳朵“车轮”花瓣这些复杂概念种类远多于简单边缘所以需要更多通道来编码。一句话3 个通道 3 种颜色给人看的256 个通道 256 种学到的特征给网络用的。第五章 批归一化Batch Normalization——网络的校准器5.1 问题背景内部协变量偏移训练神经网络时每一层的输入分布会随着前面层参数的更新而不断变化。今天第 3 层收到的数据分布是这样的明天参数更新后又变了。这种现象叫内部协变量偏移Internal Covariate Shift。后果后面的层需要不断适应前面层输出分布的变化训练变得又慢又不稳定。5.2 BatchNorm 做了什么对于一个 batch 的数据BatchNorm 在每个通道上做以下操作计算均值和方差统计当前 batch 在该通道上所有像素值的均值 μ 和方差 σ²标准化把每个值减去均值、除以标准差拉到均值 0、方差 1x^x−μσ2ϵ\hat{x} \frac{x - \mu}{\sqrt{\sigma^2 \epsilon}}x^σ2ϵx−μ缩放和平移再乘以一个可学习的参数 γ加上一个可学习的参数 βyγ⋅x^βy \gamma \cdot \hat{x} \betayγ⋅x^β第 3 步很重要——如果网络觉得这个通道不需要均值 0、方差 1它可以通过学习 γ 和 β 把分布调回去。也就是说BatchNorm 给了网络选择权可以标准化也可以不标准化。5.3 BatchNorm 的好处好处解释训练更快每层输入分布稳定了梯度传播更顺畅可以用更大的学习率不那么依赖初始化即使初始权重不太好BatchNorm 也能把数据矫正过来轻微的正则化效果因为每个 batch 的统计量有随机性相当于给训练加了一点噪声5.4 在本项目里怎么用的Conv2d(3, 64) → BatchNorm2d(64) → ReLU固定套路卷积 → BatchNorm → 激活。BatchNorm 放在激活函数之前先把卷积输出的分布校准好再送给 ReLU 决定开关。第六章 Dropout——随机翘课防过拟合6.1 什么是过拟合训练集上表现很好但新数据上表现很差。就像一个学生背完了所有历年真题的答案但遇到新题就不会做了。6.2 Dropout 的原理训练时每一步随机选择一部分神经元暂时关掉输出置 0剩下的神经元正常工作。正常网络 Dropout(0.3) 后 ○ ─ ○ ─ ○ ○ ─ ✕ ─ ○ ✕ 表示被关掉的神经元 ○ ─ ○ ─ ○ ○ ─ ○ ─ ✕ ○ ─ ○ ─ ○ ✕ ─ ○ ─ ○ ○ ─ ○ ─ ○ ○ ─ ○ ─ ○每一步被关掉的神经元都是随机的所以每一步训练的其实是一个残缺版的网络。6.3 为什么 Dropout 能防过拟合直觉解释有两个角度角度一防止共适应如果某几个神经元总是抱团一起工作它们可能合作记住了训练数据的某些特殊模式噪声而不是学到真正有用的规律。Dropout 随机拆散它们迫使每个神经元独立地学有用的特征。角度二集成学习每次 Dropout 关掉不同的神经元相当于训练了一个不同的小网络。最终的网络可以看作是指数级多个小网络的集成而集成学习天然能降低过拟合。6.4 训练 vs 推理训练时随机关掉神经元比如 30%推理时测试/部署所有神经元都打开但每个神经元的输出乘以 (1 - dropout_rate)保证输出的期望值和训练时一致PyTorch 的nn.Dropout已经自动处理了这个切换你只需要在评估时调用model.eval()就行。6.5 Dropout vs Dropout2d类型关掉什么适用场景Dropout随机关掉单个神经元全连接层Dropout2d随机关掉整个通道卷积层为什么卷积层要关掉整个通道因为同一个通道内的像素是高度相关的它们是同一个卷积核产生的只关掉单个像素几乎没效果需要把整个通道一起关掉才有意义。第七章 全连接层Fully Connected Layer——最终的投票器7.1 全连接层的角色经过多层卷积和池化后图片已经被压缩成了一个高维特征向量比如 256×4×4 4096 维。这个向量包含了图片的语义摘要。全连接层的任务就是根据这个摘要给 100 个类别打分。7.2 怎么理解全连接特征向量4096 维 → 隐藏层512 维 → 输出层100 维 每个输入连接 每个输入连接 第 i 个数 属于第 i 类的得分 每个输出 每个输出全连接就是每一个输入节点都和每一个输出节点有连接。4096 → 512 这一层就有 4096×512 ≈ 200 万个参数。7.3 为什么不直接从特征图接到 100 类理论上可以但中间加一个隐藏层4096 → 512 → 100给了网络一个缓冲先把 4096 维的特征压缩到 512 维去掉冗余信息再做最终分类。实践中这样效果更好。第八章 把积木拼起来——完整的 CNN 架构8.1 本项目 CNN 的完整数据流让我们跟踪一张 32×32×3 的图片看它怎么一步一步变成 100 个分数输入: [batch, 3, 32, 32] ═══════ 第一阶段检测低级特征边缘、颜色块═══════ Conv2d(3→64, 3×3, pad1) → [batch, 64, 32, 32] 64 个卷积核同时扫描 BatchNorm2d(64) → [batch, 64, 32, 32] 校准分布 ReLU → [batch, 64, 32, 32] 激活 Conv2d(64→64, 3×3, pad1) → [batch, 64, 32, 32] 进一步提取 ReLU → [batch, 64, 32, 32] 激活 MaxPool2d(2) → [batch, 64, 16, 16] ★ 尺寸减半 Dropout2d(0.3) → [batch, 64, 16, 16] 随机关通道 ═══════ 第二阶段检测中级特征纹理、局部形状═══════ Conv2d(64→128, 3×3, pad1) → [batch, 128, 16, 16] 通道数翻倍 BatchNorm2d(128) → [batch, 128, 16, 16] 校准 ReLU → [batch, 128, 16, 16] 激活 Conv2d(128→128, 3×3, pad1) → [batch, 128, 16, 16] 进一步提取 ReLU → [batch, 128, 16, 16] 激活 MaxPool2d(2) → [batch, 128, 8, 8] ★ 尺寸再减半 Dropout2d(0.3) → [batch, 128, 8, 8] 随机关通道 ═══════ 第三阶段检测高级特征部件、语义═══════ Conv2d(128→256, 3×3, pad1) → [batch, 256, 8, 8] 通道数再翻倍 BatchNorm2d(256) → [batch, 256, 8, 8] 校准 ReLU → [batch, 256, 8, 8] 激活 MaxPool2d(2) → [batch, 256, 4, 4] ★ 尺寸再减半 ═══════ 分类阶段 ═══════ Flatten → [batch, 4096] 拍平 Linear(4096→512) → [batch, 512] 压缩 ReLU → [batch, 512] 激活 Dropout(0.3) → [batch, 512] 防过拟合 Linear(512→100) → [batch, 100] ★ 输出 100 个类别的得分 最终: 取 100 个得分中最大的那个对应的类别作为预测结果8.2 特征是怎么逐层抽象的第一阶段浅层 第二阶段中层 第三阶段深层 ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 边缘 │ │ 纹理 │ │ 部件 │ │ 颜色变化 │ → │ 角落 │ → │ 物体轮廓 │ │ 亮度梯度 │ │ 简单形状 │ │ 语义特征 │ └─────────┘ └─────────┘ └─────────┘ 看点 看线和面 看东西这就像一个画家素描的过程先画轮廓线边缘再画纹理和阴影中级特征最后你就能看出画的是什么了高级语义。8.3 参数量对比层参数量说明Conv2d(3→64, 3×3)3×64×3×3 64 1,792很少权重共享的功劳Conv2d(64→64, 3×3)64×64×3×3 64 36,928还是不多Linear(4096→512)4096×512 512 2,097,664一下子 200 万卷积层参数少是因为权重共享——一个 3×3 的卷积核在整张图上滑动时用的是同一组参数。而全连接层每个连接都是独立的参数。第九章 训练的全过程——从白纸到学会分类9.0 CNN 是监督学习吗本项目里的 CNN 是典型的监督学习——每张训练图片都带有标签“猫”“汽车”“苹果”……模型预测一个类别和标签比较算损失再调参数。有标准答案、对着答案学就是监督学习。不过 CNN 本身只是一种网络架构不绑定学习方式。它也能用在别的范式里学习范式有没有标签CNN 怎么用例子监督学习全有直接训练分类/检测本项目CIFAR-100自监督学习全无自己给自己造任务SimCLR半监督学习少量有 大量无结合有标签和无标签数据FixMatch一句话CNN 是工具监督学习是使用方式。9.1 前向传播数据从输入层一路算到输出层得到 100 个得分logits。9.2 计算损失用交叉熵损失函数衡量预测和真实答案差多远。如果给正确类别打了最高分损失就小否则损失就大。9.3 反向传播从损失出发从后往前计算每个参数对损失的贡献度梯度。这个过程用的是微积分的链式法则。你可以理解为最终成绩不好损失大需要追责——从最后一层开始问是你的参数太大了还是太小了该往哪个方向调一层一层往前问直到第一层。9.4 参数更新优化器根据梯度更新参数θ新θ旧−学习率×梯度\theta_{\text{新}} \theta_{\text{旧}} - \text{学习率} \times \text{梯度}θ新θ旧−学习率×梯度9.5 重复以上四步反复执行。每遍历完整个训练集一次称为一个epoch。一般训练几十到几百个 epoch 后网络就能学会分类了。┌──────────────────────────────────────────┐ │ │ │ 输入图片 → 前向传播 → 得到预测 │ │ ↓ │ │ 计算损失 │ │ ↓ │ │ 反向传播 │ │ ↓ │ │ 更新参数 │ │ ↓ │ │ 下一个 batch ───────→│ │ │ └──────────────────────────────────────────┘第十章 常见疑问解答Q1卷积核的初始值是怎么确定的随机初始化。PyTorch 默认用 Kaiming 初始化也叫 He 初始化专门为 ReLU 激活函数设计能让每层输出的方差保持在合理范围内避免一开始就梯度爆炸或消失。Q2为什么通道数越来越多3 → 64 → 128 → 256因为图片的空间尺寸在不断缩小32 → 16 → 8 → 4每个位置能看到的区域越来越大需要表达的信息也越来越抽象。增加通道数就是给网络更多的维度来编码这些复杂信息。可以类比一段话翻译成英文可能只需要 10 个词但翻译成摩尔斯电码就需要几百个字符。越底层的编码方式像素值越简单直接越高层的编码语义特征越需要更多维度来表达。Q3如果不做池化会怎样计算量会非常大特征图一直是 32×32每个卷积核只能看到 3×3 的局部区域即使叠很多层视野增长也很慢池化后同样的 3×3 卷积核在下一层实际上看到了原图更大的区域Q4BatchNorm 在推理时怎么工作训练时用的是当前 batch 的均值和方差。推理时用的是训练过程中累积的全局均值和方差移动平均。这样推理时不依赖 batch 大小单张图片也能正常工作。Q5为什么用 ReLU 而不用 sigmoidsigmoid 的输出范围是 (0, 1)在两端梯度几乎为 0饱和区多层叠加后梯度会指数级衰减梯度消失问题。ReLU 在正数区域梯度恒为 1不存在这个问题。而且 ReLU 计算就是一个 max 操作比 sigmoid 的指数运算快得多。Q6CNN 的感受野是什么意思感受野是指输出特征图上的一个像素对应输入图片上多大的区域。第一个卷积层3×3感受野 3×3经过一次池化后再卷积感受野变大了因为池化缩小了特征图后续的 3×3 核实际上覆盖了原图更大的区域层数越深感受野越大网络能看到的上下文越多这也是为什么深层网络能识别整体而不仅仅是局部。第十一章 从本项目的 CNN 到更强大的网络本项目的 CNN 是一个较为基础的架构。如果你想了解它和业界主流网络的关系网络年份核心创新和本项目的关系LeNet-51998最早的 CNN用于手写数字识别本项目的 CNN 可以看作 LeNet 的加强版AlexNet2012更深更宽首次用 ReLU 和 Dropout本项目用了同样的 ReLU Dropout 策略VGGNet2014全部用 3×3 小卷积核靠深度取胜本项目的多层 3×3 卷积思路和 VGG 一致ResNet2015残差连接解决了超深网络的退化问题本项目没有用残差连接是下一步可以尝试的方向EfficientNet2019同时优化深度、宽度和分辨率更高级的架构设计本项目的 CNN 麻雀虽小五脏俱全包含了理解现代 CNN 所需要的所有基础组件。掌握了这些之后再去看 ResNet、DenseNet 等更复杂的网络就只是在这些基础上做加法了。总结CNN 核心概念一页纸┌─────────────────────────────────────────────────────────────┐ │ CNN 核心概念速查 │ ├─────────────┬───────────────────────────────────────────────┤ │ 卷积 │ 用小窗口扫描图片提取局部特征 │ │ 通道 │ 多个卷积核 多个观察角度 │ │ padding │ 在图片周围补零保持尺寸不变 │ │ stride │ 卷积核每次移动的步长 │ │ ReLU │ 负数变 0引入非线性 │ │ MaxPool │ 取局部最大值缩小尺寸保留显著特征 │ │ BatchNorm │ 标准化每层输出加速训练稳定梯度 │ │ Dropout │ 随机关掉神经元/通道防止过拟合 │ │ Dropout2d │ 关掉整个通道专门给卷积层用的 Dropout │ │ Flatten │ 把多维特征图拍成一维向量 │ │ 全连接层 │ 根据特征向量给每个类别打分 │ │ 交叉熵损失 │ 衡量预测和真实标签之间的差距 │ │ 反向传播 │ 从损失出发计算每个参数该怎么调 │ │ 感受野 │ 输出的一个点对应输入的多大区域 │ │ 权重共享 │ 同一个卷积核在整张图上复用大幅减少参数 │ └─────────────┴───────────────────────────────────────────────┘