# 深度学习 Lab4

**截止时间：2026-04-03 23:59**  
**提交地址：** https://send2me.cn/T9sigO2-/ReqHSKUPtbCGjQ

## 实验内容
本次实验要求使用 **NumPy** 补全一个两层 MLP，完成 **MNIST 手写数字分类** 任务。

模型结构为：

`输入(784) -> 隐藏层(100) -> LeakyReLU -> 输出层(10) -> Softmax -> Log`

其中：
- 输入图片大小为 `28×28`
- 输出为 10 个类别（数字 0~9）
- 隐藏层激活函数为 **LeakyReLU**

## 实验文件说明
- `exercise_mlp.py`：主程序，用于读取数据、训练模型、生成预测结果
- `feedforward_np_version.py`：需要补全的 NumPy 版本代码
- `feedforward_pytorch_version.py`：PyTorch 参考实现
- `data/`：MNIST 数据集

## TODO
请在 `feedforward_np_version.py` 中补全带有中文注释**todo**的部分，主要包括：
- LeakyReLU 的反向传播
- Softmax 的反向传播
- 损失函数计算
- 前向传播
- 后向传播
- 梯度下降参数更新

## 如何运行
在实验目录下运行：

```bash
python exercise_mlp.py
```

运行后，程序会：
- 使用 NumPy 版本训练 MLP
- 输出训练过程中的 loss 和 train acc
- 对测试集生成预测结果文件 `data/predict.txt`
- 额外运行 PyTorch 版本作为参考

## 提交内容
请按课程要求提交完成后的代码及结果文件。
文件命名：学号_姓名_Lab4.zip
压缩包内应包含：
- 已补全的`feedforward_np_version.py`
- 根据训练结果生成的`data/predict.txt`

## 说明
- 不能修改项目其余代码，只能在todo下补全代码并在完成后替换原pass语句
- 不能import其他工具包
- loss应有合理下降，训练集准确率应有合理提升
- 请独立完成，不要直接照搬往年solution或他人代码
- 请于Deadline前提交，过时不候
- 实验评分包括但不限于代码正确性、完整性、predict.txt在测试集上acc等。Evaluation脚本参考如下：
```python
def compute_acc(pred_file):
    with gzip.open(r'.\data\t10k-labels.gz', 'rb') as f:
        gold = np.frombuffer(f.read(), np.uint8, offset=8)

    with open(pred_file) as f:
        pred = f.readlines()
    pred = [int(sent.strip()) for sent in pred]
    correct_case = [i for i, _ in enumerate(gold) if gold[i] == pred[i]]

    acc = len(correct_case)*1./len(gold)
    print('The predicted accuracy is %s' %acc)

if __name__ == '__main__':
    pred_file = 'data/predict.txt'
    compute_acc(pred_file)
```
