一个面向深度学习入门的 PyTorch / NumPy 代码合集,按照“线性模型 → 梯度下降 → 反向传播 → PyTorch 基础 → 卷积神经网络 → 循环神经网络”的学习路线组织。仓库中的每个脚本都配有中文注释,适合用来理解深度学习中的核心概念,并作为课程作业或练习代码。
- 基础数学与手写实现:穷举法拟合线性模型、批量梯度下降、随机梯度下降、反向传播。
- PyTorch 入门:线性回归、逻辑斯蒂回归、多维特征输入、
Dataset/DataLoader、多分类问题。 - 卷积神经网络:卷积、Padding、Stride、最大池化,以及 LeNet-5、AlexNet、VGG-16、GoogLeNet、ResNet-18 的简化实现。
- 循环神经网络:使用简单 RNN 对 MNIST 进行十分类,将每张图片视为长度为 28 的序列。
- 可视化输出:损失曲线、三维损失曲面、训练准确率曲线,以及 CNN 经典架构的 HTML 架构图。
建议按以下顺序阅读和运行代码:
| 模块 | 主题 | 关键代码 |
|---|---|---|
| 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 |
| 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'linear_model.py
- 使用数据集
y = 2x:x_data = [1.0, 2.0, 3.0],y_data = [2.0, 4.0, 6.0]。 - 遍历
w从0.0到4.0,步长0.1,穷举计算 MSE。 - 将
w和对应的 MSE 画成曲线,保存为output/P2/loss_curve.png。
linear_model2.py
- 使用数据集
y = 3x + 2:x_data = [1.0, 2.0, 3.0],y_data = [5.0, 8.0, 11.0]。 - 同时遍历
w和b,绘制 MSE 随(w, b)变化的三维损失曲面。 - 保存为
output/P2/loss_surface_3d.png。
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。
Back_propagation.py
- 使用 PyTorch 的
requires_grad和backward()自动求导,实现最简单的反向传播。 - 权重
w初始化为 1.0,学习率 0.01,训练 100 个 epoch。 - 训练后预测
x = 4,应接近y = 8。
Back_propagation2.py
- 使用二次模型
y = w1 * x² + w2 * x + b拟合线性数据。 - 展示多参数自动求导、梯度更新和梯度清零流程。
- 代码注释说明:用二次曲线拟合线性模型属于过参数化,损失较难收敛到 0。
linear_nn.py
- 使用
torch.nn.Linear(1, 1)、torch.nn.MSELoss(size_average=False)和torch.optim.SGD。 - 训练 100 个 epoch,打印最终的
w、b以及对x = 4的预测值。
linear_nn2.py
- 与
linear_nn.py相同的模型结构,训练 1000 个 epoch,便于观察损失逐步下降直至收敛。
LogisticRegression.py
- 使用
F.sigmoid将线性输出映射到(0, 1)区间。 - 使用
torch.nn.BCELoss(size_average=False)作为二分类损失。 - 数据集为 3 个样本,展示 Logistic Regression 的完整训练流程。
Multiply_features.py
- 读取
datasets/diabetes.csv,共 759 个样本、8 个特征、1 个二分类标签。 - 模型结构:
8 → 6 → 4 → 1,每层后接 Sigmoid。 - 使用
BCELoss和SGD(lr=0.1),训练 100 个 epoch。 - 自动选择 CUDA 或 CPU,并绘制训练损失曲线。
DatasetAndDataLoader.py
- 自定义
DiabetesDataset,实现__getitem__和__len__。 - 使用
DataLoader进行批量加载:batch_size=32、shuffle=True、num_workers=4。 - 模型结构同样为
8 → 6 → 4 → 1,配合 Sigmoid、BCELoss 和 SGD 训练 100 个 epoch。
如果 Windows 环境下因多进程导致卡顿,可将
num_workers改为0或把训练代码放入if __name__ == '__main__':中运行。
Mutiply.py
- 使用 MNIST 手写数字数据集。
- 将
28 × 28图像展平成 784 维向量。 - MLP 结构:
784 → 512 → 256 → 128 → 64 → 10,中间层使用 ReLU。 - 使用
CrossEntropyLoss和带动量的 SGD,训练 10 个 epoch,并在测试集上打印准确率。
| 文件 | 内容 |
|---|---|
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.py 和 CNN_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)
该目录包含多个经典 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、CrossEntropyLoss、SGD(lr=0.01, momentum=0.9),自动选择 CUDA 或 CPU。
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.png:w与 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/:练习过程生成的图像,如三维图和二次函数图。
仓库目录名包含中文。建议在仓库根目录下运行脚本,或确保当前工作目录位于对应脚本所在目录,因为部分脚本使用 ../datasets 这样的相对路径加载数据。
MNIST 和 CIFAR-10 由 torchvision.datasets 自动下载。首次运行时需要联网,数据会缓存在 ../datasets 中。
可以。大多数模型脚本都包含:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")没有 GPU 时会自动使用 CPU,只是训练速度较慢。
linear_model.py、linear_model2.py 等脚本使用了 matplotlib.use('Agg') 或先 savefig 再 show,因此在无显示服务器环境中也能保存图片。若 plt.show() 阻塞,可删除该行或改用 savefig。
本仓库主要面向深度学习学习者和课程练习,代码以清晰可读为目标,并非生产级实现。部分模型为了便于理解对原论文结构做了简化,例如将输出类别改为 CIFAR-10 的 10 类。