Skip to content

Repository files navigation

DeepLearningCode

一个面向深度学习入门的 PyTorch / NumPy 代码合集,按照“线性模型 → 梯度下降 → 反向传播 → PyTorch 基础 → 卷积神经网络 → 循环神经网络”的学习路线组织。仓库中的每个脚本都配有中文注释,适合用来理解深度学习中的核心概念,并作为课程作业或练习代码。

项目概览

  • 基础数学与手写实现:穷举法拟合线性模型、批量梯度下降、随机梯度下降、反向传播。
  • PyTorch 入门:线性回归、逻辑斯蒂回归、多维特征输入、Dataset / DataLoader、多分类问题。
  • 卷积神经网络:卷积、Padding、Stride、最大池化,以及 LeNet-5、AlexNet、VGG-16、GoogLeNet、ResNet-18 的简化实现。
  • 循环神经网络:使用简单 RNN 对 MNIST 进行十分类,将每张图片视为长度为 28 的序列。
  • 可视化输出:损失曲线、三维损失曲面、训练准确率曲线,以及 CNN 经典架构的 HTML 架构图。

学习路线

建议按以下顺序阅读和运行代码:

模块 主题 关键代码
P2 线性模型 linear_model.pylinear_model2.py
P3 梯度下降算法 GD_algorithm.pyStochastic_GD.py
P4 反向传播 Back_propagation.pyBack_propagation2.py
P5 通过 PyTorch 实现线性回归 linear_nn.pylinear_nn2.py
P6 逻辑斯蒂回归 LogisticRegression.py
P7 处理多维特征的输入 Multiply_features.py
P8 处理数据集 DatasetAndDataLoader.py
P9 多分类问题 Mutiply.py
P10 卷积神经网络基础 conv.pypadding.pystride.pymaxpooling.pyCNN.pyCNN_GPU.py
P11 卷积神经网络进阶 LeNet-5.pyAlexNet.pyVGG-16.pyGoogleNet.pyResNet.py
RNN 循环神经网络 RNN_simple.py

目录结构

DeepLearningCode/
├── datasets/
│   └── diabetes.csv
├── P2线性模型/
│   ├── linear_model.py
│   └── linear_model2.py
├── P3梯度下降算法/
│   ├── GD_algorithm.py
│   └── Stochastic_GD.py
├── P4反向传播/
│   ├── Back_propagation.py
│   └── Back_propagation2.py
├── P5通过Pytorch实现线性回归/
│   ├── linear_nn.py
│   └── linear_nn2.py
├── P6逻辑斯蒂回归/
│   └── LogisticRegression.py
├── P7处理多维特征的输入/
│   └── Multiply_features.py
├── P8处理数据集/
│   └── DatasetAndDataLoader.py
├── P9多分类问题/
│   └── Mutiply.py
├── P10卷积神经网络基础/
│   ├── conv.py
│   ├── padding.py
│   ├── stride.py
│   ├── maxpooling.py
│   ├── CNN.py
│   └── CNN_GPU.py
├── P11卷积神经网络进阶/
│   ├── LeNet-5.py
│   ├── AlexNet.py
│   ├── VGG-16.py
│   ├── GoogleNet.py
│   ├── ResNet.py
│   └── *.html
├── RNN/
│   └── RNN_simple.py
├── Exercise/
│   ├── P2/
│   └── P4/
├── output/
│   ├── P2/
│   └── P3/
└── .gitignore

环境与依赖

  • Python 3.8+
  • PyTorch 与 torchvision
  • NumPy
  • Matplotlib
  • mpl_toolkits(Matplotlib 自带)

安装依赖:

pip install torch torchvision numpy matplotlib

部分脚本会自动选择 GPU 运行。如果安装了合适的 CUDA 版本,直接使用 PyTorch 官方命令安装 GPU 版即可;没有 GPU 时脚本会自动回退到 CPU。

快速开始

git clone https://github.com/Raven-Sheng/DeepLearningCode.git
cd DeepLearningCode

运行一个基础示例:

python "P2线性模型/linear_model.py"
python "P3梯度下降算法/GD_algorithm.py"
python "P5通过Pytorch实现线性回归/linear_nn.py"

Windows PowerShell 中如遇中文路径问题,可使用单引号或 ./ 形式:

python '.\P2线性模型\linear_model.py'

各模块说明

P2 线性模型

linear_model.py

  • 使用数据集 y = 2xx_data = [1.0, 2.0, 3.0]y_data = [2.0, 4.0, 6.0]
  • 遍历 w0.04.0,步长 0.1,穷举计算 MSE。
  • w 和对应的 MSE 画成曲线,保存为 output/P2/loss_curve.png

linear_model2.py

  • 使用数据集 y = 3x + 2x_data = [1.0, 2.0, 3.0]y_data = [5.0, 8.0, 11.0]
  • 同时遍历 wb,绘制 MSE 随 (w, b) 变化的三维损失曲面。
  • 保存为 output/P2/loss_surface_3d.png

P3 梯度下降算法

GD_algorithm.py

  • 目标函数仍为 y = 2x
  • 使用批量梯度下降:计算整个数据集上的平均梯度,更新权重 w
  • 学习率 lr = 0.01,最多训练 100 个 epoch。
  • 梯度绝对值小于 1e-6 时提前停止,训练曲线保存为 output/P3/GD_algorithm.png

Stochastic_GD.py

  • 随机梯度下降:每个 epoch 随机打乱样本顺序,逐样本更新参数。
  • 用整个数据集的平均损失评估训练进度,平均损失小于 1e-6 时提前停止。
  • 训练曲线保存为 output/P3/Stochastic_GD.png

P4 反向传播

Back_propagation.py

  • 使用 PyTorch 的 requires_gradbackward() 自动求导,实现最简单的反向传播。
  • 权重 w 初始化为 1.0,学习率 0.01,训练 100 个 epoch。
  • 训练后预测 x = 4,应接近 y = 8

Back_propagation2.py

  • 使用二次模型 y = w1 * x² + w2 * x + b 拟合线性数据。
  • 展示多参数自动求导、梯度更新和梯度清零流程。
  • 代码注释说明:用二次曲线拟合线性模型属于过参数化,损失较难收敛到 0。

P5 通过 PyTorch 实现线性回归

linear_nn.py

  • 使用 torch.nn.Linear(1, 1)torch.nn.MSELoss(size_average=False)torch.optim.SGD
  • 训练 100 个 epoch,打印最终的 wb 以及对 x = 4 的预测值。

linear_nn2.py

  • linear_nn.py 相同的模型结构,训练 1000 个 epoch,便于观察损失逐步下降直至收敛。

P6 逻辑斯蒂回归

LogisticRegression.py

  • 使用 F.sigmoid 将线性输出映射到 (0, 1) 区间。
  • 使用 torch.nn.BCELoss(size_average=False) 作为二分类损失。
  • 数据集为 3 个样本,展示 Logistic Regression 的完整训练流程。

P7 处理多维特征的输入

Multiply_features.py

  • 读取 datasets/diabetes.csv,共 759 个样本、8 个特征、1 个二分类标签。
  • 模型结构:8 → 6 → 4 → 1,每层后接 Sigmoid。
  • 使用 BCELossSGD(lr=0.1),训练 100 个 epoch。
  • 自动选择 CUDA 或 CPU,并绘制训练损失曲线。

P8 处理数据集

DatasetAndDataLoader.py

  • 自定义 DiabetesDataset,实现 __getitem____len__
  • 使用 DataLoader 进行批量加载:batch_size=32shuffle=Truenum_workers=4
  • 模型结构同样为 8 → 6 → 4 → 1,配合 Sigmoid、BCELoss 和 SGD 训练 100 个 epoch。

如果 Windows 环境下因多进程导致卡顿,可将 num_workers 改为 0 或把训练代码放入 if __name__ == '__main__': 中运行。

P9 多分类问题

Mutiply.py

  • 使用 MNIST 手写数字数据集。
  • 28 × 28 图像展平成 784 维向量。
  • MLP 结构:784 → 512 → 256 → 128 → 64 → 10,中间层使用 ReLU。
  • 使用 CrossEntropyLoss 和带动量的 SGD,训练 10 个 epoch,并在测试集上打印准确率。

P10 卷积神经网络基础

文件 内容
conv.py 使用 torch.nn.Conv2d,观察输入 (1, 5, 100, 100) 到输出 (1, 10, 98, 98) 的形状变化。
padding.py 用固定的 3×3 卷积核对 5×5 输入做 padding=1 卷积,理解边界填充。
stride.py 使用 stride=2 的卷积,理解步长对输出尺寸的影响。
maxpooling.py 使用 2×2 最大池化,理解特征图下采样。
CNN.py 在 MNIST 上实现一个简单 CNN:两个卷积层 + 最大池化 + 全连接层,训练 10 个 epoch。
CNN_GPU.py CNN.py 的 GPU 版本,自动选择设备并绘制准确率曲线。

CNN.pyCNN_GPU.py 的模型结构:

输入 (1, 28, 28)
→ Conv2d(1, 10, kernel_size=5)
→ ReLU → MaxPool2d(2)
→ Conv2d(10, 20, kernel_size=5)
→ ReLU → MaxPool2d(2)
→ Flatten (320)
→ Linear(320, 10)

P11 卷积神经网络进阶

该目录包含多个经典 CNN 的简化实现,并配有对应的架构图 HTML 文件。

文件 模型 数据集与输入 说明
LeNet-5.py LeNet-5 MNIST,输入 resize 到 32×32 使用平均池化、Tanh 激活和三层全连接。
AlexNet.py AlexNet CIFAR-10,输入 resize 到 224×224 5 个卷积层、3 个全连接层和 Dropout。
VGG-16.py VGG-16 CIFAR-10,输入 resize 到 224×224 多个 3×3 卷积堆叠,配合最大池化和全连接。
GoogleNet.py GoogLeNet / Inception v1 CIFAR-10,输入 resize 到 224×224 实现 Inception 多分支结构。
ResNet.py ResNet-18 CIFAR-10,输入 resize 到 224×224 实现 BasicBlock 残差块和短路连接。

架构图文件:

  • alexnet_arch.html:AlexNet 架构图
  • vgg16_arch.html:VGG-16 架构图
  • googlenet_arch.html:GoogLeNet(Inception v1)架构图
  • resnet18_arch.html:ResNet-18 架构图

除 LeNet-5 使用 MNIST 外,其余四个模型统一使用 CIFAR-10,并缩放到 224×224 输入。训练配置均为 10 个 epoch、CrossEntropyLossSGD(lr=0.01, momentum=0.9),自动选择 CUDA 或 CPU。

RNN 循环神经网络

RNN_simple.py

  • 使用 MNIST 数据集演示简单 RNN。
  • (1, 28, 28) 的灰度图看作长度为 28 的序列,每个时间步输入一行 28 维向量。
  • RNN 隐藏层大小为 128,取最后一个时间步的输出,通过全连接层映射到 10 类。
  • 使用 CrossEntropyLoss 和带动量的 SGD,训练 10 个 epoch。
  • 代码顶部注释记录了参考结果:loss 约 0.112,测试准确率约 96.41%。

输出说明

  • output/P2/loss_curve.pngw 与 MSE 的二维曲线。
  • output/P2/loss_surface_3d.png(w, b) 与 MSE 的三维曲面。
  • output/P3/GD_algorithm.png:批量梯度下降的训练损失曲线。
  • output/P3/Stochastic_GD.png:随机梯度下降的训练损失曲线。
  • accuracy.png:部分 GPU 训练脚本在当前目录生成的准确率曲线,已被 .gitignore 忽略。
  • Exercise/:练习过程生成的图像,如三维图和二次函数图。

常见问题

1. 中文路径或目录切换问题

仓库目录名包含中文。建议在仓库根目录下运行脚本,或确保当前工作目录位于对应脚本所在目录,因为部分脚本使用 ../datasets 这样的相对路径加载数据。

2. MNIST / CIFAR-10 下载

MNIST 和 CIFAR-10 由 torchvision.datasets 自动下载。首次运行时需要联网,数据会缓存在 ../datasets 中。

3. 无 GPU 时能运行吗?

可以。大多数模型脚本都包含:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

没有 GPU 时会自动使用 CPU,只是训练速度较慢。

4. Matplotlib 无图形界面

linear_model.pylinear_model2.py 等脚本使用了 matplotlib.use('Agg') 或先 savefigshow,因此在无显示服务器环境中也能保存图片。若 plt.show() 阻塞,可删除该行或改用 savefig

说明

本仓库主要面向深度学习学习者和课程练习,代码以清晰可读为目标,并非生产级实现。部分模型为了便于理解对原论文结构做了简化,例如将输出类别改为 CIFAR-10 的 10 类。

About

LeNet-5 CPU/GPU实现与CUDA矩阵运算加速实践

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages