以代码复现为主题的深度学习入门

算是我的一点入门心得,我大概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模式一步步理解代码。任务一的代码是最简单的一种代码结构。任务二是我入门时的,比任务一更加模块化,但万变不离其宗。任务三是我开源的,它作为入门代码理解起来很困难,因为引用跳来跳去,但任务一/二/三的基本结构是一致的,因此任务三作为依赖复杂的代码的一个示例。

基本任务一:复现分类代码

复现代码

代码介绍

  • 图像分类、目标检测、语义分割是计算机视觉三大基本任务,本代码复现对象是图像分类。
  • 这份代码结构简单,环境依赖少,且开源代码仓库(即链接)里提供了数据集。
  • 所需的计算资源少,应该不到1G的显存需求,可以在自己电脑上轻松复现。
  • 多询问Deepseek等大语言模型。

基本任务目标

  • 复现出仓库中汇报的性能,即下表中任意指标。
BaselinePost-hoc logit adjustmentLogit-adjusted loss
CIFAR10LT0.71270.78160.7857
CIFAR100LT0.39850.44040.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)
  1. 损失函数初始化

    1. 即第34行的criterion = nn.CrossEntropyLoss().to(device)
    2. [延伸] 自己写一个类,进行交叉熵计算,替换从torch.nn库中直接调用的nn.CrossEntropyLoss()
  2. 优化器及调度器初始化

    1. 即56行与61行,简单知道如此初始化即可。
  3. 训练循环

    1. epoch和batch在哪里体现?
    2. 模型如何计算?即ResNet类的forward()函数
    3. 模型如何切换训练与推理模式?即model.train()model.eval()
  4. 模型保存

    1. 即87行。
  • 目标完成后,基本能够理解深度学习的训练流程,并能够根据自己的idea定位到可能需要修改的位置。

扩展任务二:复现检索代码

复现代码

代码介绍

  • 这份代码是检索任务下的目标再辨识任务,
    • 检索任务,可以理解为完成对花草拍照,知道照片可能属于哪类植物。
    • object re-identification,ReID,它的训练过程和分类任务一样,但推理时使用相似度距离来判断行人身份。
  • 这份代码应该约需要4G不到的显存。
  • 这份代码需要自行下载数据集。
  • 这份代码在提供传参的同时,还使用了外部的配置文件。

任务目标

  • 复现代码,达到论文汇报的性能。
  • 理解代码,知道ReID任务在推理过程如何完成行人身份的检索。

扩展任务三:复现分割代码

复现代码

代码介绍

  • 这份代码是语义分割任务。
    • 简单来说,一张512x512分辨率的图像,需要对512x512个像素点进行分类。
  • 这份代码的依赖复杂,依赖于MMSegmentation工具箱,是近几年语义分割的主流工具箱。
  • 这份代码提供了训练时的日志、训练完成的权重。
  • 这份代码训练时约需要16G显存,但本任务不要求训练,仅要求推理,而推理没有显存需求。

任务目标

  • 实现推理。
    • 下载代码。
    • 在仓库给出的google drive链接中下载训练好的权重。
    • 找到MMSegmentation的使用文档,查阅如何使用已训练好的权重进行推理。
    • 在ADE20K数据集上完成推理,性能约能达到53.33% mAcc与38.10% mIoU。

版权声明:
作者:MWHLS
链接:https://mwhls.top/5110.html
来源:无镣之涯
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>