以代码复现为主题的深度学习入门
算是我的一点入门心得,我大概21年左右开始学,GPT前的时代,这些年跑了不少任务,分类、检测、分割、检索、生成,监督,无监督,半监督,蒸馏,报菜名一样,一些任务比较熟悉,一些任务只会复现来测通用性。发了五篇论文,最好的那篇是这里的任务三,发论文中作用最大的可能是堆实验和推翻重写论文。
前置需求
- Python的变量定义,判断语句,循环语句,import引用,类定义,类的属性与方法,类的实例化,实例的方法调用。
- 上述概念知道长什么样即可,看到不懂的可现查。
- 创建一个.md文件,复制粘贴以下内容,并使用Markdown编辑器查看。
- 即打开后看不到
####的标题样式与-的分点样式。
- 即打开后看不到
> 算是我的一点入门心得,我大概21年左右开始学,GPT前的时代,这些年跑了不少任务,分类、检测、分割、检索、生成,监督,无监督,半监督,蒸馏,报菜名一样,一些任务比较熟悉,一些任务只会复现来测通用性。发了五篇论文,最好的那篇是这里的任务三,发论文中作用最大的可能是堆实验和推翻重写论文。
#### 前置需求
- Python的变量定义,判断语句,循环语句,import引用,类定义,类的属性与方法,类的实例化,实例的方法调用。
- 上述概念知道长什么样即可,看到不懂的可现查。
- 创建一个.md文件,复制粘贴以下内容,并使用Markdown编辑器查看。
- 即打开后看不到####的标题样式与-的分点样式。
#### 简介
- 这个入门路线能仅依靠百度等资源与Debug模式自学完成入门,无需Deepseek等大模型,无需他人指导。
- 从运行简洁的开源代码开始,理解深度学习的基本训练/推理流程,实现代码复现性能达到论文汇报水平,对训练/推理代码简单修改,最终学会分类/检索/分割三个任务的训练与推理复现。
- 我的入门路线和这里类似,复现代码并用debug模式一步步理解代码。任务一的代码是最简单的一种代码结构。任务二是我入门时的,比任务一更加模块化,但万变不离其宗。任务三是我开源的,它作为入门代码理解起来很困难,因为引用跳来跳去,但任务一/二/三的基本结构是一致的,因此任务三作为依赖复杂的代码的一个示例。
## 基本任务一:复现分类代码
#### 复现代码
- Long-tail Learning via Logit Adjustment,ICLR 2021
- 开源代码:https://github.com/Chumsy0725/logit-adj-pytorch
#### 代码介绍
- 图像分类、目标检测、语义分割是计算机视觉三大基本任务,本代码复现对象是图像分类。
- 这份代码结构简单,环境依赖少,且开源代码仓库(即链接)里提供了数据集。
- 所需的计算资源少,应该不到1G的显存需求,可以在自己电脑上轻松复现。
- 多询问Deepseek等大语言模型。
#### 基本任务目标
- 复现出仓库中汇报的性能,即下表中任意指标。
| | Baseline | Post-hoc logit adjustment | Logit-adjusted loss |
| ---------- | -------- | ------------------------- | ------------------- |
| CIFAR10LT | 0.7127 | 0.7816 | 0.7857 |
| CIFAR100LT | 0.3985 | 0.4404 | 0.4402 |
- 完成路径简述:
- 下载仓库中的所有文件。
- 安装conda并创建一个python 3.8的虚拟环境。
- 在虚拟环境中安装GPU版本的pytorch。
- 运行仓库中的训练命令,如python main.py --dataset cifar10-lt。
- 运行完成后,结果大约为 0.7127。
- 目标完成后,基本能够理解一份深度学习代码的复现流程。
#### 扩展学习目标
- 理解以下结构并写为学习记录。
- 下面会以main.py文件的各行进行介绍。
1. 参数传递
1. 如何在命令行中,传超参数给代码,即第15,16行。
2. 数据集初始化
1. 数据集怎么从npy文件转为机器学习可用的变量?
1. 即第27行的train_loader, val_loader = utils.get_loaders(args)
2. 这个数据集变量应该会包含图像变量、标签变量。
2. [延伸] 这份数据集是打包为npy文件进行加载,但npy文件并不好理解,尝试在网上找到对应的图像文件版本,从分散的图像文件中加载数据集,并正常复现出结果。
3. 模型初始化
1. 模型如何完成初始化?
1. 即第29行的model = torch.nn.DataParallel(resnet32(num_classes=num_class))
2. 对应ResNet类的__init__()函数的调用
2. [延伸] torchvision提供了resnet的调用函数,用它代替29行,参考如下。
from torchvision import models
model_weight = models.ResNet18_Weights.IMAGENET1K_V1
model = models.resnet18(weights=model_weight)
3. 损失函数初始化
1. 即第34行的criterion = nn.CrossEntropyLoss().to(device)
2. [延伸] 自己写一个类,进行交叉熵计算,替换从torch.nn库中直接调用的nn.CrossEntropyLoss()。
4. 优化器及调度器初始化
1. 即56行与61行,简单知道如此初始化即可。
5. 训练循环
1. epoch和batch在哪里体现?
2. 模型如何计算?即ResNet类的forward()函数
3. 模型如何切换训练与推理模式?即model.train()与model.eval()
6. 模型保存
1. 即87行。
- 目标完成后,基本能够理解深度学习的训练流程,并能够根据自己的idea定位到可能需要修改的位置。
## 扩展任务二:复现检索代码
#### 复现代码
- TransReID: Transformer-based Object Re-Identification,ICCV 2021
- https://github.com/damo-cv/TransReID
#### 代码介绍
- 这份代码是检索任务下的目标再辨识任务,
- 检索任务,可以理解为完成对花草拍照,知道照片可能属于哪类植物。
- object re-identification,ReID,它的训练过程和分类任务一样,但推理时使用相似度距离来判断行人身份。
- 这份代码应该约需要4G不到的显存。
- 这份代码需要自行下载数据集。
- 这份代码在提供传参的同时,还使用了外部的配置文件。
#### 任务目标
- 复现代码,达到论文汇报的性能。
- 理解代码,知道ReID任务在推理过程如何完成行人身份的检索。
## 扩展任务三:复现分割代码
#### 复现代码
- Fair Training with Zero Inputs, AAAI 2025
- https://github.com/asd123pwj/ZUT
#### 代码介绍
- 这份代码是语义分割任务。
- 简单来说,一张512x512分辨率的图像,需要对512x512个像素点进行分类。
- 这份代码的依赖复杂,依赖于MMSegmentation工具箱,是近几年语义分割的主流工具箱。
- 这份代码提供了训练时的日志、训练完成的权重。
- 这份代码训练时约需要16G显存,但本任务不要求训练,仅要求推理,而推理没有显存需求。
#### 任务目标
- 实现推理。
- 下载代码。
- 在仓库给出的google drive链接中下载训练好的权重。
- 找到MMSegmentation的使用文档,查阅如何使用已训练好的权重进行推理。
- 在ADE20K数据集上完成推理,性能约能达到53.33% mAcc与38.10% mIoU。简介
- 这个入门路线能仅依靠百度等资源与Debug模式自学完成入门,无需Deepseek等大模型,无需他人指导。
- 从运行简洁的开源代码开始,理解深度学习的基本训练/推理流程,实现代码复现性能达到论文汇报水平,对训练/推理代码简单修改,最终学会分类/检索/分割三个任务的训练与推理复现。
- 我的入门路线和这里类似,复现代码并用debug模式一步步理解代码。任务一的代码是最简单的一种代码结构。任务二是我入门时的,比任务一更加模块化,但万变不离其宗。任务三是我开源的,它作为入门代码理解起来很困难,因为引用跳来跳去,但任务一/二/三的基本结构是一致的,因此任务三作为依赖复杂的代码的一个示例。
基本任务一:复现分类代码
复现代码
- Long-tail Learning via Logit Adjustment,ICLR 2021
- 开源代码:https://github.com/Chumsy0725/logit-adj-pytorch
代码介绍
- 图像分类、目标检测、语义分割是计算机视觉三大基本任务,本代码复现对象是图像分类。
- 这份代码结构简单,环境依赖少,且开源代码仓库(即链接)里提供了数据集。
- 所需的计算资源少,应该不到1G的显存需求,可以在自己电脑上轻松复现。
- 多询问Deepseek等大语言模型。
基本任务目标
- 复现出仓库中汇报的性能,即下表中任意指标。
| Baseline | Post-hoc logit adjustment | Logit-adjusted loss | |
|---|---|---|---|
| CIFAR10LT | 0.7127 | 0.7816 | 0.7857 |
| CIFAR100LT | 0.3985 | 0.4404 | 0.4402 |
- 完成路径简述:
- 下载仓库中的所有文件。
- 安装conda并创建一个python 3.8的虚拟环境。
- 在虚拟环境中安装GPU版本的pytorch。
- 运行仓库中的训练命令,如
python main.py --dataset cifar10-lt。 - 运行完成后,结果大约为
0.7127。
- 目标完成后,基本能够理解一份深度学习代码的复现流程。
扩展学习目标
- 理解以下结构并写为学习记录。
- 下面会以main.py文件的各行进行介绍。
参数传递
- 如何在命令行中,传超参数给代码,即第15,16行。
数据集初始化
- 数据集怎么从npy文件转为机器学习可用的变量?
- 即第27行的
train_loader, val_loader = utils.get_loaders(args) - 这个数据集变量应该会包含图像变量、标签变量。
- 即第27行的
- [延伸] 这份数据集是打包为npy文件进行加载,但npy文件并不好理解,尝试在网上找到对应的图像文件版本,从分散的图像文件中加载数据集,并正常复现出结果。
- 数据集怎么从npy文件转为机器学习可用的变量?
模型初始化
- 模型如何完成初始化?
- 即第29行的
model = torch.nn.DataParallel(resnet32(num_classes=num_class)) - 对应ResNet类的
__init__()函数的调用
- 即第29行的
- [延伸] torchvision提供了resnet的调用函数,用它代替29行,参考如下。
- 模型如何完成初始化?
from torchvision import models
model_weight = models.ResNet18_Weights.IMAGENET1K_V1
model = models.resnet18(weights=model_weight)损失函数初始化
- 即第34行的
criterion = nn.CrossEntropyLoss().to(device) - [延伸] 自己写一个类,进行交叉熵计算,替换从
torch.nn库中直接调用的nn.CrossEntropyLoss()。
- 即第34行的
优化器及调度器初始化
- 即56行与61行,简单知道如此初始化即可。
训练循环
- epoch和batch在哪里体现?
- 模型如何计算?即ResNet类的
forward()函数 - 模型如何切换训练与推理模式?即
model.train()与model.eval()
模型保存
- 即87行。
- 目标完成后,基本能够理解深度学习的训练流程,并能够根据自己的idea定位到可能需要修改的位置。
扩展任务二:复现检索代码
复现代码
- TransReID: Transformer-based Object Re-Identification,ICCV 2021
- https://github.com/damo-cv/TransReID
代码介绍
- 这份代码是检索任务下的目标再辨识任务,
- 检索任务,可以理解为完成对花草拍照,知道照片可能属于哪类植物。
- object re-identification,ReID,它的训练过程和分类任务一样,但推理时使用相似度距离来判断行人身份。
- 这份代码应该约需要4G不到的显存。
- 这份代码需要自行下载数据集。
- 这份代码在提供传参的同时,还使用了外部的配置文件。
任务目标
- 复现代码,达到论文汇报的性能。
- 理解代码,知道ReID任务在推理过程如何完成行人身份的检索。
扩展任务三:复现分割代码
复现代码
- Fair Training with Zero Inputs, AAAI 2025
- https://github.com/asd123pwj/ZUT
代码介绍
- 这份代码是语义分割任务。
- 简单来说,一张512x512分辨率的图像,需要对512x512个像素点进行分类。
- 这份代码的依赖复杂,依赖于MMSegmentation工具箱,是近几年语义分割的主流工具箱。
- 这份代码提供了训练时的日志、训练完成的权重。
- 这份代码训练时约需要16G显存,但本任务不要求训练,仅要求推理,而推理没有显存需求。
任务目标
- 实现推理。
- 下载代码。
- 在仓库给出的google drive链接中下载训练好的权重。
- 找到MMSegmentation的使用文档,查阅如何使用已训练好的权重进行推理。
- 在ADE20K数据集上完成推理,性能约能达到53.33% mAcc与38.10% mIoU。


共有 0 条评论