Project 3: Neural Networks

Due: 2026.05.15.

Machine Learning


简介

在这个项目中,我们将实现深度学习模型,在CIFAR-10数据集上进行训练和评测。 CIFAR—10是一个经典的图像分类数据集,包含10个类别的32x32彩色图像:飞机(airplane)、汽车(automobile)、 鸟(bird)、猫(cat)、 鹿(deer)、狗(dog)、 青蛙(frog)、 马(horse)、船(ship)、卡车(truck) 。 本次作业使用完整的CIFAR-10数据集(训练集50000张,测试集10000张)。 本次作业所需的数据集在data文件夹下。

本次作业的文件下载地址:作业文件

本次实验中包含以下几个文件:

lab-dl/
├── data/  # 数据目录
├── data_utils.py   #数据集加载与预处理工具(请勿修改)
└── reference_mlp.py  # 参考代码: Py Torch MLP 完整训练流程(请勿修改)
└── task_l_manual_mlp.py #题目一: 从零实现多层感知机(你需要完成)
└── task_l_manual_mlp.py #题目二:CNN模型设计与优化(你需要完成)

题目1: 神经网络实践 [50pts]

  • 本题为一道编程题,需在不使用高级神经网络库API的前提下,利用torch.Tensor从零编程实现一个多层前馈神经网络,进行CIFAR-10图像分类任务。

请先运行python reference_mlp.py查看参考实现的训练过程,然后参考task_l_manual_mlp.py文件中的提示来完成相关的代码。 这份代码的功能包括:

  • CIFAR-10数据集下载与预处理(已实现)
  • 训练基于PyTorch 实现的多层前馈神经网络对CIFAR-10数据集分类(已实现)
  • 训练从零实现的相同多层前馈神经网络对CIFAR-10数据集分类 (待实现)

任务要求

本题需要在不使用现有神经网络库api(如torch.nn 、 torch.optim、 sklearn、tensorflow)的前提下, 复现 reference_mlp.py 中利用PyTorch 库编写的一段多层前馈神经网络代码,。你可以使用 torch.Tensor 进行张量运算(支持GPU加速),但不能使用 torch.n.Linear、torch.nn.CrossEntropyLoss、torch.optim.SGD等高级封装。要求:

  • 保持网络结构一致;
  • 保持损失函数一致;
  • 保持batch_size、learning_rate、epochs等超参数一致。
  • 保持前向传播和反向传播过程一致。

具体来说需要实现框架中四个函数(四个TODO):actDerivationforwardlossbackward, 具体功能和要求参见代码注释以及如下表格:

函数预期行为
actDerivation此函数是激活函数(题中为ReLU)的导数,在代码框架中预期返回输入向量的导数向量。
forward此函数是神经网络的前向传播方法,在代码框架中预期根据输入算出神经网络各个隐层状态,也即更新self.x即可,不需要有返回值。完整的预测类别过程在方法外已由out = np.argmax(self.x[-1], axis=1)实现。
loss此函数神经网络损失函数,根据预测值y_pred和真实值y_real计算损失(题中为分类任务的交叉熵损失)并返回此值。主要用于损失的汇报,不一定会在反向传播中用到。
backward此函数是神经网络梯度反向传播函数,根据预测值y_pred和神经网络各层隐状态计算神经网络各层参数的梯度,也即最终需要更新self.grad_wself.grad_b即可,不需要返回任何值和其他额外操作,后续参数的更新已经由update函数实现。

评分标准

我们会重新运行你所提交的代码文件, 具体评分标准如下:

  • 5/50: 复现的代码保持了网络结构、损失函数以及各超参数一致,且可正常运行;
  • 10/50: 复现的代码中actDerivation逻辑正确;
  • 20/50: 复现的代码中forward函数前向传播过程逻辑正确;
  • 25/50: 复现的代码中loss函数损失计算过程逻辑正确;
  • 30/50: 复现的代码可在5min内迭代完规定的epochs轮数;
  • 50/50: backward过程逻辑实现基本正确,具体来说需要:运行结果中running_loss整体为下降趋势,运行结果中最后一轮的running_acc 超过50%;
  • (注:由千CIFAR-10为彩色图像且类别间差异较大,纯MLP模型的准确率通常低千CNN, 40%以上即为合格。)

题目2: 卷积神经网络设计与优化[50pts]

  • 本题为一道编程题,旨在使用PyTorch设计卷积神经网络(CNN),在CIFAR-10数据集上进行分类。你需要自行设计网络结构、数据增强策略和训练策略,井尽可能提高模型在测试集上的分类准确率。

请参见task_2_manual_cnn.py文件中的提示来完成相关的代码,并通过python sk_2_manual_cnn.py运行训练。 这份代码的功能包括:

  • CIFAR-10数据集加载与预处理 (已实现)
  • 设计CNN模型架构 (待实现,20pts)
  • 实现数据增强策略 (待实现,10pts)
  • 选择优化器与学习率策略 (待实现,10pts)
  • 在测试数据上达到目标准确率 (待实现,10pts)

任务要求

你需要在task_2_manual_cnn. py中完成以下内容:

  • 设计一个卷积神经网络模型(可参考VGG、 ResNet等经典架构)
  • 实现合适的数据增强策略(如随机裁剪、水平翻转、颜色抖动等)
  • 选择合适的优化器(如SGD with Momentum、 Adam等)和学习率调度策略
  • 允许使用在ImageNet等外部数据集上预训练的模型权重
  • 只能使用torch 、torchvision 、 numpy、 matplotlib 这四个库。

评分标准

模型性能部分(10pts)按测试集准确率评分:

测试准确率得分
小于60%0/10
60%-70%/td>3/10
70%-80%5/10
80%-85%7/10
85%-90%9/10
90%以上10/10

其余40分根据代码实现的完整性和合理性评分(模型设计20pts、 数据增强10pts、 训练策略10pts)。

思路提示

  • 网络架构:卷积神经网络(CNN)是图像分类的基础。经典架构包括VGG、ResNet、 DenseNet等。残差连接可以有效缓解深层网络的梯度消失间题。
  • 数据增强:适当的数据增强(如RandomCrop、 RandomHorizontalFlip、 ColorJitter等)可以有效提升泛化能力。
  • 正则化:Dropout、 Batch Normalization、 权重衰减等正则化技术可以防止过拟合。
  • 训练策略:学习率调度(如CosineAnnealingLR)、 合适的优化器选择都会影响最终性 能默认epoch数仅提供参考, 可自行增减 。

测试环境

以下为测试环境使用的版本:
  • Python: 3.9+
  • PyTorch: 2.0+
  • torchvision: 0.15+
  • Numpy: 1.24+
  • matplotlib: 3.7+
你可以使用你喜欢的任意版本, 只需确保你的代码能顺利运行。

代码提交

请打包提交task_l_manual_mlp.py和task_2_manual_cnn. py 代码文件。 实验报告可以另附一份PDF文件, 请包含与reference_mlp.png类似的训练日志。 最终提交的压缩包需要命名为“学号_姓名zip"。 请勿修改 data_utils. py和 reference_mlp.py中的内容。

学术诚信

允许同学之间的相互讨论,但是署你名字的工作必须由你完成,必须独立完成作业的书写过程。

如果发现作业之间高度相似将被判定为互相抄袭行为, 抄袭和被抄袭双方的成绩都将被取消。因此请主动防止自己的作业被他人抄袭。