第 23 章练习与答案
先完成题目,再看答案。代码从章节目录运行,使用已安装本章依赖的 Python。
🌈 关于《AI 零基础 36 讲》课后训练
📚与正式讲解配套学习
本篇是《AI 零基础 36 讲》的配套课后训练,与对应章节的正式讲解一起使用。整个系列面向初学者,从日常 AI
使用逐步进入编程、模型训练和大模型应用开发。✍️先独立作答,再核对答案
训练围绕本章知识安排概念判断、结果分析或动手任务,并提供参考答案与解释。建议先读完对应的正式文章,再独立作答;遇到困难时回看相关例子,最后核对答案。
💻代码题请亲手运行
观察程序输出,确认自己能解释结果、发现错误并完成修复。做完一道题,也要弄清答案为什么成立。
题目
- 1437 张训练图,每批最多 64 张,保留最后一批。训练 30 轮共更新几次参数。改为每批 128 张后,最后一批有几张,每轮更新几次。
- 一批 64 张灰度图的输入形状为什么是
(64, 1, 8, 8)。经过 Flatten 和输出层后,各是什么形状。 - 计算两层 Linear 的参数数量。偏置也要计入。
- 类别标签为 5,应使用浮点数 5.0 还是整数类型。训练用交叉熵时,是否先对 logits 做 Softmax。
- 混淆矩阵中数字 8 有 31 张识别正确、4 张被识别为 1。计算数字 8 的召回率,并解释它与总准确率的区别。
- 单图预测给数字 5 分配 0.9973,能否据此保证识别任何手写 5。如何确认独立入口使用了训练时的图片规则。
参考答案
1. 更新次数
每轮 23 批,最后一批 29 张,共 690 次更新。每批 128 张时,11 批完整图片后剩 29 张,共 12 批。若轮次不变,则共更新 360 次。批量改变也改变优化过程,不能只凭更新更少就判断结果更好。
importmathforsizein[64,128]:batches=math.ceil(1437/size)print(size,batches,1437%size,batches*30)输出为64 23 29 690和128 12 29 360。
2. 张量形状
四个维度依次为样本、通道、高、宽。Flatten 后为(64, 64),隐藏层为(64, 32),输出层为(64, 10)。第一个 64 表示图片数量,展平后的第二个 64 表示每张图的像素数。
3. 参数数量
第一层有 64×32 个权重和 32 个偏置,第二层有 32×10 个权重和 10 个偏置,共 2410。ReLU 和 Flatten 没有可学习参数。
print(64*32+32+32*10+10)4. 标签与损失
使用torch.long的整数类别编号 5。交叉熵直接接收十个原始类别分数,训练接口不先做 Softmax。展示预测概率时,才在推理结果上使用 Softmax。两组已运行的错误与修复见错误记录。
5. 分类成绩
召回率为 31/35,约 88.57%,只考察真实为 8 的图片。总准确率为 347/360,约 96.39%,考察全部十类图片。某一类比较弱时,总准确率可能掩盖它。
6. 独立预测
不能保证。这个数依赖模型和输入,未经过校准,也没有覆盖各种拍照方式。检查模型保存的结构、类别顺序、输入尺寸和归一化规则;再确认 PNG 与 NPY 经统一入口后张量相同。下面实际读取两个文件比较,结果为True。
importtorchfromexamples.image_coreimportload_single_image png=load_single_image("data/sample-digit.png")npy=load_single_image("data/sample-digit.npy")print(torch.equal(png,npy))