Project 4: Machine Learning

Due: 2025.11.30.

Machine Learning


简介

在这个项目中,我们将实现简单的机器学习模型,并且对其在数据集上进行进行训练和评测。

本次作业所需的文件为:lab4.zip

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

lab4/
├── data  # 包含需要用到的数据,不需要做任何改动
├── lab4_1.ipynb  # 题目一的ipynb文件,后续将在里面复现一个基于torch实现的多层感知机
└── lab4_2.ipynb  # 题目二的ipynb文件,后续将在里面实现一个基于knn的完整机器学习系统

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

  • 本题为一道编程题,需在不使用现有神经网络库的前提下,从零编程实现一个多层前馈神经网络,进行手写数字识别任务。本题使用的数据集为手写数字识别mnist数据集

请参见lab4_1.ipynb文件中的提示来完成相关的代码。这份工程的功能包括:

  • 手写数字识别mnist数据集预处理(已实现)
  • 训练基于pytorch实现的多层前馈神经网络对mnist数据集分类(已实现)
  • 训练从零实现的相同多层前馈神经网络对mnist数据集分类 (待实现)

任务要求

本题需要在不使用现有神经网络库api(sklearn、pytorch、tenserflow等等库的相关api,例如只能使用numpy的ndarray、pytorch的tensor等等而不能使用torch.nn或者torch.optim)的前提下, 复现lab4_1.ipynb 中利用PyTorch 库编写的一段多层前馈神经网络代码, 要求:

  • 保持网络结构一致;
  • 保持损失函数一致;
  • 保持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函数实现。

评分标准

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

  • 5/55: 复现的代码保持了网络结构、损失函数以及各超参数一致,且可正常运行;
  • 10/55: 复现的代码中actDerivation逻辑正确;
  • 25/55: 复现的代码中forward函数前向传播过程逻辑正确;
  • 30/55: 复现的代码中loss函数损失计算过程逻辑正确;
  • 35/55: 复现的代码可在5min内迭代完规定的epochs轮数;
  • 55/55: backward过程逻辑实现基本正确,具体来说需要:运行结果中running_loss整体为下降趋势,运行结果中最后一轮的running_acc 超过93%;

题目2: 机器学习系统实践[45pts]

  • 本题为一道编程题,旨在实现一个完整的机器学习系统。需要实践完成分类器实现、指标计算、验证集参数选择、交叉验证、不均衡数据集指标计算等等步骤。
  • 考虑到本次作业的程序计算时间和任务数据量,本题选用svmguide1数据集,因其每个样本仅有四个特征,且训练集样本数相对适中。

请参见lab4_2.ipynb文件中的提示来完成相关的代码。这份工程的功能包括:

  • 数据集读取 (已实现)
  • 训练集与验证集的划分 (已实现)
  • 实现一个knn分类器(待实现,10pts)
  • 实现准确率(accuracy)评估指标 (待实现,5pts)
  • 根据验证集进行超参数选择 (待实现,5pts)
  • 实现5折交叉验证进行超参数选择 (待实现,10pts)
  • 确定超参数后完成在测试集上的测试 (待实现,5pts)
  • 针对不均衡数据集,实现precision, recall, F1 score的计算 (待实现,10pts)

任务要求及评分标准

需要在不使用现有机器学习库api(sklearn)的前提下, 实现以上功能待实现功能,分数分配如上所示。

测试环境

以下为测试环境采用的版本:

  • Python: 3.9.19
  • PyTorch: 2.6.0
  • Numpy: 1.26.4

你可以使用你喜欢的任意版本, 只需确保你的代码能顺利运行。

代码提交与评分

请打包提交lab4_1.ipynb和qlab4_2.ipynb代码文件,如果有需要额外补充的实验报告可以直接在ipynb中编写。最终提交的压缩包需要命名为"学号_姓名.zip"。

第四次实践作业上传链接NJU_box_Project4。初次提交可以在应用的“提交作业”模块按照要求提交作业(不要只上传文件,记得点下面的提交按钮;不要交错作业文件);提交成功后带着提交时间和修改时间的提交记录可以立刻在“修改作业”模块看到(请检查确认提交成功,若最终因技术原因未收到作业这将是你按时提交的重要证据)。若要修改作业文件请直接到“修改作业”模块的提交记录中修改作业文件所在单元格,不要重复提交(旧的作业是可以删掉的,在单元格最右侧有个交互按钮可以点开,不要上传多个作业文件)。助教完成打分后,评分及评分明细也会在“修改作业”模块的提交记录中显示(每人只能看到自己的)。

本次作业的完成与提交过程中,有问题可以找助教 葛凌岳 沟通。

学术诚信

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

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

致谢

本次项目相关代码基于周志华老师的《机器学习导论》吴建鑫老师的《模式识别与计算机视觉》课程改写。感谢他们为社区做出的指导与贡献。