新人在接触Pytorch以及深度学习等领域时,面对一个开源的代码可能无从下手,一个Pytorch框架相对比较负责,文件也多,其中的逻辑不免让初学者感到不知所措,下面大致梳理一下Pytorch各文件夹的作用和逻辑,其中的细节还是需要多实践才能了解
(1)Pytorch整体框架
如下图所示是一份Pytorch项目的框架
链接:https://github.com/chenyuntc/pytorch-best-practice
一份开源代码包含的文件(或者说框架)大致有如下几种
checkpoints: 保存训练模型
data:数据相关操作,比如数据集存放,数据处理函数的存放
models:模型定义,可以有多个模型
utils:可能用到的工具函数
config.py:配置文件,所有可配置的变量都集中在此,并提供默认值
main.py:主文件,训练和测试程序的入口,可通过不同的命令来指定不同的操作和参数
requirements.txt:程序依赖的第三方库
README.md:提供程序的必要说明
(2)Pytorch各文件夹详解
由于data和requirements.txt不复杂,这里就不展开介绍
<1>checkpoints
Checkpoint是用于描述在每次训练后保存模型参数(权重)的惯例或术语。这就像在游戏中保存关卡时你可以随时通过加载保存文件回复游戏。你可以加载保存的模型权重重新开启训练甚至可以之后进行一个推理。
我们经常会看到后缀名为.pt, .pth, .pkl的pytorch模型文件,这几种模型文件在格式上有什么区别吗?其实它们并不是在格式上有区别,只是后缀不同而已(仅此而已)
如上图所示,这是博主之前训练模型所保存的权重文件,一个完整的Pytorch模型文件,包含了如下参数:
- model_state_dict:模型参数
- optimizer_state_dict:优化器的状态
- epoch:当前的训练轮数
- loss:当前的损失值
不同模型权重保存的格式
weights一般是YOLO darknet的模型保存格式
pth一般是PyTorch的模型保存格式
ckpt一般是tenseflow的模型保存格式
<2>models
models这块根据项目的不同,存放的代码自然是不同的,总的来说就是存放训练数据的模型框架
如在sahi开源代码中https://github.com/obss/sahi/tree/deaed7ac02498c0f5839d7bc0ebd18b50e9f7019
就存放了很多模型,每一个模型对应一个文件
<3>utils
把一些常用的“小工具”类型的函数提取出来,独立存放在/utils文件夹,比如绘制图表的函数、文件写入读取函数等。
比如在下面的图中utils就封装了可视化工具
注意,由于不同实验之间共用 utils 函数,因此 utils 的更新应该是谨慎的,同时新版本函数的接口应该兼容旧版本的接口。
<4>config.py
在模型定义、数据处理和训练等过程都有很多变量,这些变量应提供默认值,并统一放置在配置文件中,这样在后期调试、修改代码或迁移程序时会比较方便,在这里我们将所有可配置项放在config.py中。
超参数应该使用config文件(json或者csv格式)保存,在实验中以dict或者class的形式传入。应该先设置一个基础的default版的config,具体实验中使用的自定义的config应该是在default版上的继承以及修改,并且自定义的config名字需要包含实验名。
超参数可以分为:
模型超参数:模型名称(自定义)、模型路径、模型描述(由模型自动根据参数生成)、模型备注(自定义)
模型应该能够根据输入的config参数,来生成对模型结构的描述,比如"模型种类+模型version参数"。
训练超参数:random_seed、batch_size、epoch_num、优化器种类、优化器参数、learning_rate
数据加载超参数:数据集名称、数据集路径、数据集描述(由data loader自动生成)、数据集备注(自定义)
<5>main.py
主文件,训练和测试程序的入口,可通过不同的命令来指定不同的操作和参数。这里不多做介绍
<6>README.md
GitHub 的 README.md 文档规范是指在 GitHub 上创建项目时,需要编写一个 README.md 文件来介绍项目的内容、使用方法、贡献者等信息。这个文件需要遵循一定的规范,包括使用 Markdown 语法、添加项目标题、描述、安装方法、使用示例、贡献者列表等内容。这样可以让其他用户更好地了解和使用你的项目,也方便你自己维护和更新项目。
关于markdown语法,本人博文作物计数方法之合并信息生成json标签的方法_追忆苔上雪的博客-CSDN博客中也有介绍,有兴趣的可以参考
<7>关于__init__.py
一个目录如果包含了__init__.py 文件,那么它就变成了一个包(package)。__init__.py可以为空,也可以定义包的属性和方法,但其必须存在,其它程序才能从这个目录中导入相应的模块或函数。例如在data/文件夹下有__init__.py,则在main.py 中就可以from data.dataset import DogCat。而如果在__init__.py中写入from .dataset import DogCat,则在main.py中就可以直接写为:from data import DogCat,或者import data; dataset = data.DogCat,相比于from data.dataset import DogCat更加便捷。
注意,package和文件夹在pycharm中标志是不一样的,package的标志用有个小圆圈
创建文件夹和package是有不同指令的