第一部分数据集与输入预处理1. Fashion-MNIST 数据集训练集60,000 张灰度图像测试集10,000 张。图像尺寸28 × 28 像素单通道灰度。类别数10 类T恤、裤子、套衫、裙子、外套、凉鞋、衬衫、运动鞋、包、踝靴。输入特征数28 × 28 784。2. 数据预处理transformtransforms.ToTensor()将 PIL 图像或 numpy 数组转换为[0,1]范围的张量形状变为(C, H, W)。transforms.Normalize((0.5,), (0.5,))将每个像素x变为(x - 0.5)/0.5即从[0,1]映射到[-1,1]。第二部分多层感知机MLP基础1. 为什么需要nn.Flatten()全连接层nn.Linear要求输入是二维[batch, features]。原始图像形状[batch, 1, 28, 28]→ 必须“拉直”为[batch, 784]。Flatten()从第1维开始展平保留 batch 维。2. 全连接层的参数量计算必考权重数量in_features × out_features偏置数量out_features该层总参数量in_features × out_features out_features示例nn.Linear(784, 256)参数量 784×256 256 200,9603. 激活函数重点对比名称公式导数输出范围优点缺点考点ReLUmax(0, x)0 (x0), 1 (x≥0)[0, ∞)计算快正区间梯度不消失稀疏性神经元“死亡”梯度为0Sigmoid1/(1e^{-x})σ(x)(1-σ(x))≤ 0.25(0,1)平滑易解释梯度饱和易消失输出非零均值Tanh(e^x-e^{-x})/(e^xe^{-x})1 - tanh²(x)≤ 1(-1,1)零中心比 Sigmoid 稍好仍有梯度饱和问题梯度消失严重程度Sigmoid Tanh ReLUReLU 几乎不消失收敛速度ReLU 最快梯度不衰减Sigmoid/Tanh 很慢饱和区梯度极小。4. 无激活函数的后果多个线性层堆叠等价于一个线性层矩阵乘法结合律。无法学习非线性关系 → 等价于线性回归/线性分类器准确率大幅下降。第三部分模型定义方式1.nn.Sequential特点按顺序堆叠层代码简洁。适用简单的前馈网络。示例model nn.Sequential( nn.Flatten(), nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10) )2.nn.Module子类特点需要自定义__init__和forward灵活性高可加条件分支、跳连等。__init__作用定义网络层的实例如self.fc1 nn.Linear(...)。forward作用定义数据的前向传播逻辑。第四部分训练流程通用训练函数1. 损失函数与优化器多分类损失nn.CrossEntropyLoss()内部 LogSoftmax NLLLoss优化器optim.Adam常用或optim.SGD2. 每个 Epoch 的训练步骤model.train()→ 启用 Dropout/BatchNorm 训练模式遍历 DataLoaderoptimizer.zero_grad()清空梯度outputs model(images)前向传播loss criterion(outputs, labels)计算损失loss.backward()反向传播optimizer.step()更新参数3. 验证测试步骤model.eval()→ 禁用 Dropout固定 BatchNormwith torch.no_grad():→ 不记录梯度节省内存计算准确率_, predicted torch.max(outputs, 1)获取预测类别dim1表示类别维度correct (predicted labels).sum().item()最终准确率 100 * correct / total4. 为什么验证时要用eval()no_grad()eval()保证 Dropout 不随机丢弃神经元BatchNorm 使用全局统计量结果稳定。no_grad()不构建计算图防止内存爆炸且避免意外修改梯度。第五部分网络深度与性能1. 单隐藏层 vs 多隐藏层理论单隐藏层 MLP足够宽可逼近任何连续函数通用近似定理。实践多隐藏层通常用更少参数达到更高精度能学习层次化特征。过深的问题梯度消失/爆炸、过拟合、训练困难。2. 改进准确率的方法考点增加隐藏层或神经元数量调整学习率、使用更好的优化器Adam增加训练轮数数据增强正则化Dropout, BatchNorm使用更合适的激活函数ReLU系列《人工智能概论》实验3 考试题总分100分建议完成时间80分钟一、单选题每题3分共15分关于 Fashion-MNIST 数据集下列说法正确的是 A. 图像尺寸为 32×32彩色图B. 图像尺寸为 28×28灰度图C. 共有 100 个类别D. 图像已被展平为 784 维向量存储以下哪个激活函数最容易导致梯度消失问题 A. ReLUB. LeakyReLUC. SigmoidD. Tanh一个 MLP 模型定义为nn.Sequential(nn.Flatten(), nn.Linear(784,128), nn.ReLU(), nn.Linear(128,10))。该模型的隐藏层即第一个 Linear 层的参数量权重 偏置是 A.128×10 10B.784×128 128C.784×128 128 128×10 10D.784×128在训练函数中验证阶段使用model.eval()和with torch.no_grad():的主要原因是 A. 提高训练速度B. 防止梯度更新模型参数并关闭 Dropout/BatchNorm 的训练行为C. 清空 GPU 显存D. 切换到数据并行模式如果 MLP 的所有隐藏层都去掉激活函数即只有线性层则整个网络等价于 A. 一个线性模型B. 一个深层非线性模型C. 一个无法训练的模型D. 一个卷积神经网络二、填空题每空2分共20分Fashion-MNIST 训练集中共有 ______ 张图像每张图像展平后的特征数为 ______。nn.Sequential模型定义时nn.Flatten()的作用是将形状(batch, 1, 28, 28)转换为(batch, ______)。在train_model函数中计算测试准确率的代码torch.max(outputs, 1)中的1表示在 ______ 维度上取最大值返回的第二个值是 ______。在nn.Module子类定义中__init__方法用于 ______forward方法用于 ______。激活函数 ReLU 在输入为负数时输出为 ______在输入为正数时输出等于 ______。三、判断题正确打“√”错误打“×”每题2分共10分 Fashion-MNIST 数据集中的图像经过ToTensor()后像素值范围变为[-1,1]。 nn.CrossEntropyLoss内部已经包含 softmax因此模型输出层不需要再添加nn.Softmax。 增加隐藏层数量一定会提高模型在测试集上的准确率。 ReLU 激活函数的输出范围是(0,1)。 在训练过程中每轮 epoch 结束后都应该调用model.train()来继续下一轮训练。四、简答题共35分以下题目均来自实验指导书中的思考题请结合复习提纲作答。简答题18分来自任务一1在 Fashion-MNIST 任务中为什么模型的第一步需要nn.Flatten()2nn.Sequential方式与nn.Module子类方式相比各自的优点是什么3nn.Module子类中__init__和forward的功能分别是什么简答题29分来自任务二1单隐藏层 MLP 和多隐藏层 MLP 在 Fashion-MNIST 上通常哪个测试准确率更高为什么2隐藏层越多越好吗请说明理由。3除了增加隐藏层还有哪些方法可以改进模型准确率至少写出3种简答题310分来自任务三1三种激活函数ReLU、Sigmoid、Tanh中哪个收敛最快哪个最终准确率最高2为什么 Sigmoid 和 Tanh 的训练速度通常比 ReLU 慢3如果去掉所有隐藏层后的激活函数模型会变成什么还能达到同样的准确率吗为什么4请用文字描述实验任务三中模型的结构输入层 → 隐藏层 → 激活函数 → 隐藏层 → 激活函数 → 输出层并注明每一层的神经元数量。简答题48分来自通用训练函数1在训练函数中测试准确率acc是如何计算的请写出详细计算步骤。2为什么验证测试时必须使用model.eval()和with torch.no_grad():如果不使用会有什么后果五、代码填空题每空2分共20分请根据上下文填写正确的代码。代码填空1模型定义6空# Sequential 方式 model_seq nn.Sequential( nn.Flatten(), nn.Linear(______, 256), # 空1: 输入维度 nn.ReLU(), nn.Linear(256, ______) # 空2: 输出维度 ) # Module 子类方式 class MLP(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super().__init__() self.fc1 nn.Linear(______, ______) # 空3、空4 self.act nn.ReLU() self.fc2 nn.Linear(______, ______) # 空5、空6 self.flatten nn.Flatten() def forward(self, x): x self.flatten(x) x self.fc1(x) x self.act(x) x self.fc2(x) return x代码填空2训练函数部分4空def train_model(model, epochs10, lr0.001): criterion nn.______() # 空7: 多分类损失函数 optimizer optim.______(model.parameters(), lrlr) # 空8: 优化器常用 for epoch in range(epochs): model.______() # 空9: 设置为训练模式 for images, labels in trainloader: optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() model.______() # 空10: 设置为评估模式 # ... 验证代码 ...参考答案与超详细解析小白必读一、单选题1. 答案B解析Fashion-MNIST 是 28×28 灰度图训练集 60000 张测试集 10000 张共 10 类。图像存储为 28×28 矩阵不是展平的。2. 答案C解析Sigmoid 的导数最大为 0.25且当输入绝对值大时导数趋近 0 → 梯度消失最严重。Tanh 稍好导数最大 1ReLU 在正区导数恒为 1几乎不消失。3. 答案B解析题目问的是“隐藏层”即第一个Linear(784,128)。参数量 输入特征数 × 输出特征数 输出特征数偏置784×128 128。选项 C 是全部层参数量不符合题意。4. 答案B解析eval()关闭 Dropout 并固定 BatchNormno_grad()禁止梯度计算防止内存浪费和无意的参数更新。5. 答案A解析无激活函数时多层线性变换的复合仍是线性变换矩阵乘法结合律等价于单个线性层。二、填空题6. 答案60000784解析官方训练集大小 6000028×28784。7. 答案784解析Flatten 保留 batch将1×28×28展平为 784。8. 答案类别或特征、第1维预测的类别索引解析torch.max(outputs, 1)在维度1类别上取最大值的索引即预测类别。9. 答案定义网络层定义前向传播逻辑解析标准概念。10. 答案0输入本身解析ReLU(x)max(0,x)。三、判断题11. 答案×解析ToTensor()将像素从 [0,255] 转为 [0,1]Normalize((0.5,),(0.5,))才转到 [-1,1]。12. 答案√解析CrossEntropyLoss 内部已包含 softmaxlog-softmax。13. 答案×解析过深易过拟合或梯度消失测试准确率可能下降。14. 答案×解析ReLU 输出 [0, ∞)。15. 答案×解析model.train()只需在每个 epoch 开始前调用一次通常在循环开始处不是每轮结束后。四、简答题详细解析简答题1(1)因为全连接层要求输入是二维[batch, features]原始图像是四维[batch, channels, height, width]Flatten 将其变为[batch, 784]。(2)Sequential简洁适合线性堆叠Module 子类灵活可定义复杂前向逻辑。(3)__init__实例化各层对象forward定义数据流过这些层的顺序。简答题2(1)通常多隐藏层更高因为多层非线性可学习层次化特征。(2)不是。过深会导致梯度消失、过拟合、训练困难。(3)调整学习率、增加神经元、数据增强、正则化Dropout、换优化器Adam等。简答题3(1)ReLU 收敛最快最终准确率通常也是 ReLU 最高。(2)Sigmoid/Tanh 在饱和区梯度极小参数更新慢ReLU 正区梯度恒为1。(3)退化为线性模型无法学习非线性关系准确率大幅下降。(4)输入层(784) → 全连接层(256) → ReLU → 全连接层(128) → ReLU → 全连接层(10) → 输出。简答题4(1)对每个 batch用torch.max(outputs,1)取预测类别与标签比较累加正确数和总数最后100 * correct / total。(2)eval()保证 Dropout/BatchNorm 行为正确no_grad()禁用梯度追踪节省内存且防止误更新。不写则验证结果不稳定且浪费资源。五、代码填空题答案空1784空210空3input_dim或784空4hidden_dim或256空5hidden_dim或256空6output_dim或10空7CrossEntropyLoss空8Adam或SGD但 Adam 更常用空9train()空10eval()