学习内容分类任务简介分类任务的输出——卷积神经网络CNN分类任务损失函数图像分类神经网络流程一、分类任务1、简介现实中多数机器学习问题并非 “预测连续数值”回归而是“判断类别归属”分类。根据类别数量分类任务可分为二分类和多分类。二分类任务只有 2 个类别判断邮件是否为垃圾邮件垃圾邮件 / 正常邮件、判断两人是否为直系亲属是 / 否。输出维度为 1通常用 0/1 表示两个类别如 0 正常邮件1 垃圾邮件。多分类任务3 个及以上类别判断图片中的动物是鸟、人、猫还是狗。输出维度为类别数需通过Softmax 函数将输出转换为类别概率取概率最大的类别为预测结果。2、回归(Regression)与分类(Classification)1左侧线性回归Linear Regression新冠感染人数预测、房价预测均属于此类核心是“预测多少”。视觉特征横轴为Size如房屋面积纵轴为连续数值如价格散点呈线性趋势分布红色直线为拟合的回归模型。核心逻辑模型学习一条 “最佳拟合线”输入特征Size后输出连续的数值预测结果如预测房价。2右侧分类任务Classification垃圾邮件识别、动物分类均属于此类核心是“判断是谁”。视觉特征横轴x1、纵轴x2为样本特征散点分为红色、蓝色两类离散标签绿色曲线为分类决策边界。核心逻辑模型学习一条 “决策边界”输入特征x1,x2后输出样本的类别归属如红色类 / 蓝色类而非连续数值。3、分类的输出设计思路错误输出为啥用Linear (?,1)输出一个数不行假设要做个分类任务区分「猫、狗、鸟」三类动物想给它们编个号 —— 猫 1狗 2鸟 3。1数字有 “远近”但类别没有数字上 2狗离 1猫近、离 3鸟远模型学的时候会傻呵呵地认为“狗和猫更像和鸟差得远”。但实际猫、狗、鸟是平级的 ——狗和猫的相似度跟狗和鸟的相似度没有这种 “数字远近” 的关系模型学错了方向。2输出的数没意义模型用 Linear (?,1) 输出的是连续数比如输入一只鸟的特征模型可能输出 2.8。你知道 2.8 该算鸟但模型会觉得 “这玩意儿介于狗2和鸟3之间”可现实里哪有 “半狗半鸟”这个数根本没法准确代表类别。3没法做到 “类别平等”你不管咋编数字比如猫 1、狗 100、鸟 1000数字总有大小、远近模型都会被带偏 —— 要么觉得 1000 的鸟 “更重要”要么觉得 1 和 100 的猫、狗 “更像”永远做不到让三个类别 “一碗水端平”。正确输出为啥Linear (?,3)输出三个数One-Hot就对了1每个类别有专属 “打分位”输出 3 个数第一个数专门给猫打分、第二个给狗、第三个给鸟仨数之间互不干扰没有 “谁近谁远” 的问题 —— 就像老师给三个学生打分各打各的不会因为小明考 90、小红考 89就觉得他俩更像。2标签只认 “自己人”One-Hot 就是给标签 “贴专属标签”猫的标签是 [1,0,0]只有猫的位置是 1其他都是 0狗是 [0,1,0]鸟是 [0,0,1]。模型一看就懂“哦这个样本只属于这一个类别其他都不是”不会瞎联想。3最终看 “谁分高”模型输出的三个数会转换成概率比如 [0.9,0.1,0]直接选概率最高的那个当预测结果 —— 猫的分最高就是猫简单直接没有任何 “数字远近” 的误导。总之类别是 “平级的、没有大小的”就不能用 “有大小、有远近” 的单个数字去代表得给每个类别单独留位置才能不搞错。二、图像分类任务从 “原始图片” 到 “模型输出”怎么做输入一张 224×224 的彩色小猫图片。模型把图片的像素信息喂进网络最后通过Linear(?, 3)输出一个 3 维向量y代表对 “狗、猫、树” 三个类别的打分。输出模型输出y [0.2, 0.7, 0.1]表示 70% 置信是猫。真实标签ŷ [0, 1, 0]One-hot 编码。用交叉熵Cross Entropy来衡量预测和真实标签的差距指导模型学习。和回归的对比回归输出 1 个连续值比如房价用 MSE 损失。分类输出 N 个类别的概率用交叉熵损失目标是 “让正确类别的概率最大”。数据视角图片在模型眼里是什么/图片怎么变成模型能懂的东西一张彩色图片在计算机里是一个3 维张量[通道数, 高度, 宽度]。这里是[3, 224, 224]3 个通道分别对应红R、绿G、蓝B三个颜色通道。每个通道是一张 224×224 的 “灰度图”每个数字代表这个像素的颜色强度。所以模型看到的不是 “小猫”而是一堆数字矩阵。接下来处理 224×224 的彩色图片3 通道形状是 [3,224,224]想喂进全连接层就得先把这个 3 维矩阵 “拉成” 1 维向量不然全连接层根本接不住。但是图像分类不用全连接网络如下图“踩坑提醒”直接用全连接网络会怎样输入是224×224×3个像素点也就是150528个数字。如果第一层全连接层输出 1000 个神经元那参数数量就是150528×10001.5×10^8(超过1亿个参数)计算量巨大训练慢还容易过拟合。况且全连接层把图片 “拍平” 成一维向量丢失了像素之间的空间关系比如猫的耳朵和眼睛的位置而这些信息对识别图像至关重要。所以图像分类任务通常不用全连接网络而是用卷积神经网络CNN它能有效提取空间特征同时大大减少参数量。三、卷积神经网络CNN核心思想用 “小模板”卷积核在图片上滑动提取局部特征而不是把整张图拍平喂给全连接层。1. 卷积的本质用 “模板” 去匹配 “特征”、先看最直观的例子定义一个简单的 “颜色模板”F(1)红F(-1)黑。用一个小的 “棋盘模板”卷积核去匹配大图当模板和大图的某个区域完全吻合时特征图上对应位置的数值就会很大比如 9表示 “这里有我要找的东西”。注数值比如9的计算是上图黄色框框里的9个数字乘以卷积核中对应位置的数字再相加即1×1(-1)×(-1)1×1(-1)×(-1)1×1(-1)×(-1)1×1(-1)×(-1)1×1 9对比之前看到的全连接网络全连接把整张图224×224×3拉成 15 万维的向量每个像素都和下一层的所有神经元相连参数量爆炸还丢失了空间信息。卷积用一个 3×3 的小窗口感受野在图上滑动只看局部信息。这样做有两个好处①参数共享同一个 3×3 的卷积核在整张图上滑动大大减少了参数量。②保留空间结构知道 “眼睛在鼻子上面” 这种空间关系而不是把它们当成一串无关的数字。2、从 “看整张图” 到 “看局部特征”CNN 的层级化思想第一层basic detector用小卷积核提取简单的特征比如 “鸟的喙”、“鸟的眼睛”、“爪子”。第二层advanced detector把这些简单特征组合起来识别更复杂的模式比如 “一只完整的鸟”。结论我们不需要看整张图只需要关注图中的小特征把它们组合起来就能知道这是一只鸟。3、彩色图片的卷积多通道一起算一张彩色图片是一个 3 维张量[通道数(C), 高度(H), 宽度(W)]也就是 R、G、B 三个颜色通道叠在一起。卷积核也必须是 3 维的[3, 3, 3]这样才能同时在三个颜色通道上做匹配。每个卷积核扫过图片会输出一个新的 “特征图”多个卷积核就输出多张特征图堆叠起来就形成了下一层的输入。4、Zero Padding零填充来保持特征图尺寸不变卷积后尺寸会变小原始图片是一个 4×4 的矩阵卷积核是 2×2 的 Filter1。输出的特征图尺寸会变成3×3比原来的 4×4 小了一圈。如果我们再用一个 2×2 的卷积核去卷积这个 3×3 的特征图输出就会变成 2×2再卷一次就变成 1×1图就没了。这显然不是我们想要的。补充特征图输出尺寸计算公式默认无填充 P0、步长 S1输出尺寸 输入尺寸 I - 卷积核大小 K 1✅ 例子4×4 输入I42×2 卷积核K2→ 4-213 → 输出 3×3 特征图Zero Padding 是怎么解决这个问题的Zero Padding零填充的做法很简单在原始图片的周围补上一圈值为 0 的像素把图片 “撑大” 一点。在四周各补一圈 0P1就能让 4×4 的图片经过 2×2 卷积后输出仍然是 4×4。补充不同 P 值padding的含义P0不填充特征图会被 “削边”尺寸变小。P1四周各补 1 圈 0。P2四周各补 2 圈 0以此类推。5、卷积网络进阶1更大的感受野感受野指的是卷积神经网络中某一层的一个神经元在原始输入图片上对应看到的区域大小。两种方式扩大感受野1用更大的卷积核比如从 3×3 换成 5×5一步就能看到更大的区域。2堆叠更多的卷积层用多个小卷积核如 3×3层层叠加也能等效出一个更大的感受野。2卷积层的深度与参数量卷积层的本质一个卷积层就是由多个卷积核Filters组成的。每个卷积核都在输入的特征图上滑动提取一种特定的特征。有多少个卷积核就会输出多少张新的特征图这就构成了新层的 “深度”。输入特征图的深度通道数决定了卷积核的深度比如哦输入是 3 通道的 RGB 图卷积核也必须是 3 通道的才能在所有颜色通道上做运算。输出特征图的深度等于该卷积层中卷积核的数量。参数量计算一个卷积层的总参数量就是所有卷积核的参数之和。单个卷积核参数数 卷积核高 × 卷积核宽 × 输入通道数✅ 例子3×3 卷积核 3 输入通道RGB 图→ 3×3×327 个参数✅ 例子2×2 卷积核 1 输入通道黑白图→ 2×2×14 个参数卷积层总参数数 单个卷积核参数数 × 卷积核的个数输出通道数✅ 例子3×3×3 的卷积核共 16 个 → 27×16432 个参数6、手算卷积神经网络自己练习7、特征图如何变小纯靠卷积核大小来缩小尺寸效率低不如用步长或池化1扩大步长Stride卷积核每次不只滑 1 格直接跳着滑输出尺寸会大幅缩小。卷积尺寸计算公式O I-K2P) / S 1注IinputK卷积核大小PpaddingSstride✅ 例子输入3×224×224卷积核11padding2stride4输出尺寸(224−112×2)/41 (224−114)/41 217/41 54.251 55.25向下取整为 55 → 输出64×55×55步数长这种方法有个弊端步长太大如 4会丢失信息且引入计算。池化比加步长更常用一点。2池化Pooling在特征图上做下采样subsampling比如把 2×2 的区域变成 1 个值尺寸减半。池化是下采样不改变通道数只缩小宽高常用两种i最大池化Max Pooling取窗口内的最大值保留最显著的特征。ii平均池化Avg Pooling取窗口内的平均值平滑特征。8、手搓卷积神经网络从 3×224×224 到 1024×7×7如何将一张 3×224×224 的图片 → 一步步变成 1024×7×7 的特征图1卷积可以改变通道数不强行缩小尺寸。 2池化只缩小尺寸不改变通道数。最少一次卷积就够但实战中“卷积 池化” 交替进行效果更好。224 → 112 → 56 → 28 → 14 → 7从224➡7每次池化除以 2一共5 次池化。手搓流程“卷积 池化” 交替输入3 × 224 × 2243 通道 RGB 图大小 224×224➡64 × 224 × 224用了64 个卷积核通道从 3 → 64用了padding1宽高不变224×224➡128×224×224第二次卷积继续加深➡128×112×112第一次池化开始变小➡256×56×56卷积池化➡512×28×28卷积池化➡1024×14×14卷积池化➡1024×7×7池化【通道非常深1024 个特征图尺寸非常小7×7信息高度浓缩 → 可以直接送给全连接层做分类】9、卷积神经网络最后一步从 “特征图” 到 “类别预测”1从特征图到全连接层iFlatten展平卷积输出的是一个多维的特征图比如 4×4 的矩阵全连接层只认一维向量所以必须先把它 “拉直” 成一串数字。这一步就是把空间结构行和列丢掉只保留数值信息。ii全连接层Linear展平后的一维向量输入到全连接层。全连接层的作用是把这些特征 “组合” 起来最终输出每个类别的得分比如图中的 11、11.7、22。得分最高的那个就是模型预测的类别。2三种常见的 “卷积到全连接” 方式以 1024×7×7 为例i直接展平最基础把 1024×7×7 直接展平成1024 × 7 × 7 50176维的向量。然后用Linear(50176, 3)直接输出 3 个类别的得分。缺点参数量巨大50176×3容易过拟合。ii先降维再全连接更常用先加一层全连接Linear(50176, 1024)把 5 万维降到 1024 维。再用Linear(1024, 3)输出最终分类。优点减少参数量防止过拟合。iii全局池化更高级用MaxPooling(7)或AvgPooling(7)把 7×7 的区域池化成 1×1。特征图就从 1024×7×7 变成了1024×1×1相当于每个通道只保留一个全局特征值。再用Linear(1024, 1024)→Linear(1024, 3)。优点极大减少了参数量同时保留了全局信息是现在很多网络如 ResNet的常用做法。四、分类任务损失函数CrossEntropy Loss1、核心前置步骤Softmax 转换模型全连接层输出的是原始得分Logits如猫的得分 23、狗 11.7、树 20这些数值无概率意义需通过Softmax转为 0-1 的概率分布满足 “所有类别概率和为 1”。公式实例计算猫的得分 23 最大经 Softmax 后概率为 0.953占比最高狗 0、树 0.047。关键作用将 “得分大小” 转化为 “类别归属的置信度”为后续损失计算提供基础。真实标签采用 One-Hot 编码如猫的标签为[0,1,0]仅正确类别位置为 1其余为 0。Softmax 函数的 PyTorch 实现import torch import torch.nn as nn # 1. 定义模型输出的原始得分Logits对应狗:11.3, 猫:23, 树:20 y torch.tensor([11.3, 23, 20], dtypetorch.float32) # 2. 创建Softmax层dim-1表示在最后一个维度类别维度计算概率 soft nn.Softmax(dim-1) # 3. 计算概率分布并打印 y_prob soft(y) print(原始得分Logits, y) print(Softmax后的概率分布, y_prob) print(概率总和, torch.sum(y_prob)) # 验证概率和为1 输出结果 原始得分Logits tensor([11.3000, 23.0000, 20.0000]) Softmax后的概率分布 tensor([1.1431e-05, 9.5299e-01, 4.6998e-02]) 概率总和 tensor(1.0000) 2、分类损失的核心交叉熵损失分类任务不能使用回归的 MAE/MSE无法有效惩罚错误分类核心采用交叉熵损失CrossEntropy Loss分为二分类与多分类两种形式。1二分类交叉熵公式真实标签0 或 1y′模型预测的正确类别概率。二分类任务里每个样本要么是正类要么是负类只能是1正类或0负类。两种情况代入公式i真实是正类1含义只看 “正类预测概率 y′ ”y′ 越接近 1损失越小越接近 0损失越大。ii真实是负类0含义只看 “负类预测概率 1−y′ ”1−y′ 越接近 1损失越小越接近 0损失越大。总之模型预测 “是正类” 的概率是 y′真实是正类时我们惩罚 “y′ 太小”真实是负类时我们惩罚 “1−y′ 太小”也就是 y′ 太大整个公式就是不管真实是哪一类都让模型把 “正确类别的概率” 往 1 推。2多分类交叉熵公式N样本数量M类别总数第i个样本第c类的真实标签第i个样本第c类的预测概率。简化理解因 One-Hot 标签仅正确类别为 1其余为 0实际只需计算 “正确类别对应预测概率的负对数”即。样本 1真实猪预测猪的概率 0.4 → L1−log(0.4) ≈ 0.91样本 2真实狗预测狗的概率 0.4 → L2−log(0.4) ≈ 0.91样本 3真实猫预测猫的概率 0.7 → L3−log(0.1) ≈ 2.30预测错误损失远大于正确样本平均损失1.37结论预测越准确正确类别概率越接近 1log(1)≈0损失值越小预测越错误正确类别概率越接近 0log(0)→−∞损失值急剧增大有效惩罚错误。补充交叉熵损失CrossEntropyLoss需要的两个核心参数1预测的分布Predicted Distribution就是模型经过 Softmax 输出的每个类别的概率比如[0.0, 0.953, 0.047]。它代表了模型对 “这张图属于每个类别的置信度”。2真实值的下标Target Indices就是真实标签的类别编号比如 “猫” 对应的下标是 1假设类别顺序是狗0, 猫1, 树2。注意在 PyTorch 等框架中交叉熵损失函数直接接受类别下标如 1而不是 One-Hot 向量内部会自动处理。关于交叉熵的更多内容请见李老师这篇文章https://blog.csdn.net/YI_SHU_JIA/article/details/121610828?spm1001.2014.3001.5502五、完整的图像分类神经网络流程1、前向传播forward从图片到预测结果这是模型 “看图片、做判断” 的过程分为三个阶段1卷积 池化层Convolution Pooling Layers卷积Convolution用多个卷积核在图片上滑动提取局部特征如鸟的喙、羽毛纹理生成多张特征图。非线性激活Nonlinearity给卷积结果加上非线性变换让模型能学习更复杂的模式。池化Max Pooling对特征图进行下采样缩小尺寸保留最显著的特征同时减少计算量。结果得到一个 “又深又小” 的特征图如 1024×7×7。2全连接层Fully Connected Layers展平Flatten把多维的特征图 “拉直” 成一维向量vec让全连接层能处理。全连接计算将一维向量输入全连接层把提取到的特征组合起来输出每个类别的原始得分logits。3分类输出Softmax将原始得分转换为每个类别的概率分布如[0, 0.953, 0.047]表示模型对 “这张图属于每个类别的置信度”。预测概率最高的类别就是模型的预测结果如 95.3% 是猫。2、反向传播backward从损失到学习这是模型 “从错误中学习” 的过程1计算损失Loss用真实标签One-Hot 编码如[0, 1, 0]和模型预测的概率分布计算交叉熵损失。损失值越大说明模型预测得越错。2梯度下降Gradient Descent从损失值出发反向计算每个参数卷积核权重、全连接层权重的梯度。根据梯度更新参数让下一次预测的损失值更小。3、总结前向传播输入图片 → 卷积提取特征 → 全连接组合特征 → Softmax 输出概率。反向传播计算损失 → 反向求梯度 → 更新参数。目标通过不断迭代让模型的预测概率分布越来越接近真实标签的分布从而提高分类准确率。六、深度学习中 “数据为王”图像分类任务必须依赖大量带标签的图片来训练模型。没有高质量、大规模的带标签数据再先进的模型也无法发挥作用。比如猫狗分类需要大量标注了 “猫”“狗” 的图片人脸识别需要大量标注了对应身份的人脸图片。数据集与模型相互促进更大的数据集催生了更强大的模型而更强大的模型又推动了对更大、更复杂数据集的需求。经典图片数据集