在GitHub上关于深度学习的项目代码通常包含多种类型的文件,每种文件都有其特定的作用。以下是一些常见的文件及其作用的概述:
一个常用的项目结构如下:
- --project_name/ :项目名
- ----data/:数据集
- --------__init__.py
- ----datasets/:数据相关操作,如加载数据
- --------__init__.py
- --------data_loader.py:加载数据
- ----layers/:网络模型层
- --------__init__.py
- --------layer1.py:第1层
- --------layer2.py:第2层
- ----models/:backbone模型
- --------__init__.py
- --------a_model.py:a模型
- --------b_model.py:b模型
- ----exp/:包含定义、训练、验证、测试和预测方法
- --------__init__.py
- --------exp_main.py:包含定义、训练、验证、测试和预测方法
- ----configs/:配置文件
- --------__init__.py
- --------config.py:方便超参数搜索等
- ----utils/:用到的功能函数,可以是日志、评价指标计算等等
- --------__init__.py
- --------utils.py:功能函数
- --------metrics.py:评价指标计算
- ----logs/:日志文件
- --------__init__.py
- ----scripts/:脚本文件
- --------__init__.py
- ----checkpoints/:保存的模型权重
- --------__init__.py
- --------checkpoints.pt:保存的模型权重文件
- ----model_hub/:预训练模型权重
- --------__init__.py
- --------basic_model.pt:预训练好的模型权重文件
- ----main.py:主程序
- ----requirements.txt:需要的python依赖
- ----environment.yml:环境信息
- ----readme.md:项目说明
__init__.py:一个目录如果包含了__init__.py文件,那么它就变成了一个包。该文件可以为空,也可以定义包的属性和方法,但它必须存在。
datasets:数据相关操作,比如用Dataset封装数据集,再用Dataloader实现数据并加载。
layers:layers文件夹放的是模型所需要的层,不同model可能需要同样的网络层,为了保证模型代码的简洁性,单独列一个文件夹定义。
models:一般而言,核心的代码都是以model命名,或者就是以它这个模型的名字命名。可以有多个模型,一个模型一个.py文件。
exp:包含定义、训练、验证、测试、保存和预测方法,这些也可以放到main中,但是为了main的简洁性,单独设置一个文件夹进行定义。关于模型保存,Pytorch可以通过torch.save()函数将训练的模型保存为.pth/.pt/.pkl文件,Keras中训练的模型可以保存为.h5文件
configs:包含了一些预定义的配置文件,用于训练和测试深度学习模型。这些配置文件包含了模型架构、损失函数、优化器、训练和测试的超参数等,通过修改这些配置文件,可以方便地调整模型的参数和超参数,如将需要配置的参数均放在这个文件中,比如batchsize,transform,epochs,lr等超参数,以满足不同的需求和任务。
utils:通常是存放深度学习中常用的工具函数或类的文件夹,这些工具函数或类可以被多个深度模型共用,提高代码的复用性与可维护性,通常包括数据预处理函数、模型评估函数、损失函数等。
scripts:脚本文件集合,脚本文件是函数命令的集合。针对不同的任务,可以运行不同的脚本文件。
checkpoints:断点保存,保存模型权重,防止程序突然终止丢失权重文件。
model_hub:预训练好的模型权重, 是一个通过大量数据上进行训练并被保存下来的网络。可以将其通俗的理解为前人为了解决类似问题所创造出来的一个模型,有了前人的模型,当我们遇到新的问题时,便不再需要从零开始训练新模型,而可以直接用这个模型入手,进行简单的学习便可解决该新问题。
main.py:主程序,解析命令行传递超参数,执行exp中的训练、验证、测试、预测方法。
requirements.txt:需要的python依赖,可以在terminal中输入pip install -r requirements.txt命令快速在所使用环境中安装依赖。
environment.yml:用于定义和创建 Conda 环境的配置文件。它通常包含了项目所需的所有依赖项及其版本信息。可以使用该文件快速配置conda环境,具体使用方法可见:如何使用environment.yml文件配置conda环境
readme.md:一种说明文件,通常随着一个软件而发布,里面记载有软件的描述或注意事项。一般来说,开源项目的readme里作者都会写明如何使用代码和进行部署,这可以帮助我们实现这个项目。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_51193374/article/details/137114938
- __init__.py:一个目录如果包含了__init__.py文件,那么它就变成了一个包。该文件可以为空,也可以定义包的属性和方法,但它必须存在。
- README.md: 这是项目的说明文件,通常包含项目的简介、如何安装和运行代码的指南,以及其他重要信息。
- requirements.txt : 这些文件列出了项目所需的依赖和库,确保其他用户能够复现相同的开发环境。
- environment.yml:用于定义和创建 Conda 环境的配置文件。它通常包含了项目所需的所有依赖项及其版本信息。可以使用该文件快速配置conda环境
- layers/: layers文件夹放的是模型所需要的层,不同model可能需要同样的网络层,为了保证模型代码的简洁性,单独列一个文件夹定义,可能包含自定义的层实现 。
- exp:包含定义、训练、验证、测试、保存和预测方法,这些也可以放到main中,但是为了main的简洁性,单独设置一个文件夹进行定义。关于模型保存,Pytorch可以通过torch.save()函数将训练的模型保存为.pth/.pt/.pkl文件,Keras中训练的模型可以保存为.h5文件。
- main.py 或 run.py: 这是项目的主要执行文件,包含了程序的入口点和主要逻辑。
- data/: 一个专门用于存放数据的文件夹,可能进一步分为原始数据(raw)、处理后的数据(processed)和外部数据(external)等子文件夹。
- datasets/: 存放数据集的文件夹,数据相关操作,比如用Dataset封装数据集,再用Dataloader实现数据并加载。可能包含train和val子文件夹。
- models/: 包含定义深度学习模型的文件,可能包含模型架构、损失函数和优化器等配置。
- utils/ 或 helpers/: 通常是存放深度学习中常用的工具函数或类的文件夹,这些工具函数或类可以被多个深度模型共用,提高代码的复用性与可维护性,通常包括数据预处理函数、模型评估函数、损失函数等。
- notebooks/: 包含Jupyter Notebook或其他交互式笔记本文件,用于实验、分析和模型开发。
- tests/: 如果项目包含自动化测试,这个文件夹将存放测试脚本。
- config/: 包含了一些预定义的配置文件,用于训练和测试深度学习模型。这些配置文件包含了模型架构、损失函数、优化器、训练和测试的超参数等,通过修改这些配置文件,可以方便地调整模型的参数和超参数,如将需要配置的参数均放在这个文件中,比如batchsize,transform,epochs,lr等超参数,以满足不同的需求和任务。
- model_hub:预训练好的模型权重, 是一个通过大量数据上进行训练并被保存下来的网络。可以将其通俗的理解为前人为了解决类似问题所创造出来的一个模型,有了前人的模型,当我们遇到新的问题时,便不再需要从零开始训练新模型,而可以直接用这个模型入手,进行简单的学习便可解决该新问题。
- results/ 或 outputs/: 存放模型生成的输出文件、报告或可视化结果。
- scripts/: 脚本文件集合,可能包括数据预处理、模型定义、训练、评估和实用工具等脚本,针对不同的任务,可以运行不同的脚本文件。
- docs/: 存放项目相关的文档,如API文档、设计文档或用户手册。
- src/: 源代码文件夹,可能包含多个子模块或包,遵循模块化设计。
- logs/: 存放训练日志的目录 。
- checkpoints/ 或 weights/: 保存训练过程中的模型权重。
- demos/examples: 工程demo或example文件夹 。
- LICENSE: 指定了项目的许可证,说明其他用户如何使用和分发该项目。
阅读项目中的README.md文件
一般这个文件会包括:环境配置、安装依赖包、数据集加载处理、模型训练与测试、模型推理
1.环境配置:
首先就是创建一个虚拟环境,这一步就包含了你所创建环境的python版本,使用指令
conda create -n myenv python=3.8
其中myenv是创建的虚拟环境的名字,python版本是3.8
同时在进入和退出虚拟环境时可能会出现报错deactivate does not accept arguments
remainder_args: ['unet']
这是因为新版本的CUDA对进入和退出虚拟环境的指令做出了调整,如下:
//进入虚拟环境:
activate xx
//不需要在前面加上cuda//退出虚拟环境
conda deactivate
//不需要在后面加上退出的虚拟环境的名字
还有一些关于操作虚拟环境的指令如下:
列出所有环境:
conda env list删除环境 (如果需要删除创建的环境):
conda env remove -n myenv在环境中安装包:
conda install -n myenv package_name更新环境中的包:
conda update -n myenv package_name在环境中创建新的Python可执行文件 (可选,适用于使用多个Python版本):
conda create -n myenv python=3.8 anaconda导出环境 (导出环境的详细依赖列表):
conda env export > environment.yml从导出的YAML文件重新创建环境:
conda env create -f environment.yml
其中Pytorch是必备的,安装之前需要大家先查看自己的cuda版本,使用
nvidia-smi
(注意高版本的CUDA没有那个文件夹NVSMI了,直接在命令行输入这条指令,没有空格!!!)
即可得到
可以看出最高支持的CUDA的版本是12.0,也就是说我们只要下载项目所需要的Pytorch版本且支持的CUDA版本低于12.0的就好。
去网址:Previous PyTorch Versions | PyTorch
找到适合自己的对应的命令,直接在终端运行即可安装。
安装依赖库:
可以通过:在terminal中输入 pip install -r requirements.txt 命令快速在所使用环境中安装依赖包。前提是项目中包含requirements.txt文件
2. 设置环境变量
这个不是每个项目都必须设置的,主要还是参照README.md文件进行设置。
比如一些模型需要依靠环境变量来了解原始数据、预处理数据和训练模型权重的存储位置。 要使用模型的全部功能,就必须设置这三个环境变量。
首先我们应该在项目文件夹下建立数据集文件夹,在数据集文件夹下要包含原始数据、预处理数据和训练模型权重这三个文件夹,
接着在对应模型的文件夹下的paths.py程序内的程序起始部分(import后),添加进去刚才设置的环境变量:
nnUNet_raw = "路径"
nnUNet_preprocessed = "路径"
nnUNet_results = "路径"
当然在windows系统下也可以直接设置为系统变量:
set nnUNet_raw = "路径"
set nnUNet_preprocessed = "路径"
set nnUNet_results = "路径"
在Linux或macOS系统中,你可以在命令行中这样设置环境变量
export nnUNet_raw = "路径"
export nnUNet_preprocessed = "路径"
export nnUNet_results = "路径"
3.数据集载入
需要将下载的数据集导入即添加到相应的路径对应的文件夹中,接着再按照格式要求使用脚本进行格式转换。
格式转换:
使用cd 命令打开脚本所在的文件夹
使用python 命令打开脚本程序,观察参数,找到函数入口(一般在程序下方)
if __name__ == '__main__'convert_msd_dataset('/home/tom/Test/nnUNet/DATSET/nnUNet_raw/Taske2_Heart',overwrite_target_id=201)
将数据集路径添加到函数脚本程序的函数入口中,运行脚本
python convert_xx_dataset.py
数据集格式就转换完成了。
4.数据集预处理
一般在项目中也会有一个对应的.py文件,进行数据处理,一般是preparexx.py。
打开python文件,同样的是需要找到函数入口,格式同上。
注意如果项目中存在两个或多个preparexx.py文件,一般是只有一个文件包含了函数入口,其他文件都是为了这个文件服务的,同样我们也是需要操作包含函数入口的这个文件的。
找到这个文件后需要cd 进入文件对应的文件夹中,观察执行函数需要传递的参数,同样使用github上给定的指令,在命令行输入进行数据处理。比如github中给的命令:
nnUNetv2_plan_and_preprocess -d DATASET_ID --verify_dataset_integrity
实际在命令行输入的代码:
python plan_and_preprocess_entrypoints.py -d 002 --verify_dataset_integrity
其中plan_and_preprocess_entrypoints.py文件是我们的包含函数入口的数据处理文件,002是需要处理的数据集的ID,后面是验证不需要变动。
5.模型训练
首先找到模型训练脚本,一般在run文件夹下格式为train/training.py的程序,然后cd 进入对应的文件夹下,观察执行函数需要传递的参数,同样使用github上给定的指令,在命令行输入进行数据处理。比如github中给的命令:
nnUNetv2_train DATASET_NAME_OR_ID UNET_CONFIGURATION FOLD [additional options, see -h]
UNET_CONFIGURATION 是一个字符串,用于标识请求的 U-Net 配置(默认值:2d、3d_fullres、3d_lowres、 3d_cascade_lowres)。
DATASET_NAME_OR_ID 指定应在哪个数据集上进行训练。
FOLD 指定 5 倍交叉验证经过训练。
实际在命令行输入的代码:
python run_training.py 002 3d_fullers 0
其中002是数据集ID;3d_fullers是指3D U-Net模型的全分辨率配置,该模型处理3D数据时保持其原始分辨率,适用于需要高分辨率详细信息的分割任务;这些参数在github上都会有解释,根据自己的需求传入不同的参数,然后运行即可开始训练。
训练结束后,一般会产生一个result的文件夹,里面通常包含训练过程的权重,照片,系统文件,日志文件等等等。
6.模型推理预测
首先找到模型推理脚本,一般格式为predictxx.py的程序,然后cd 进入对应的文件夹下,找到函数入口,观察执行函数需要传递的参数,进行调整。例如:
predictor.initialize_from_trained_model_folder(join(nnUNet_results, 'Dataset002_Heart/nnUNetTrainer__nnUNetPlans__3d_fullres')use folds=(0,),checkpoint name='checkpoint best.pth',predictor.predict_from_files(join(nnUNet raw,'Dataset002 Heart/imagesTs'),join(nnUNet raw,'Dataset002 Heart/imagesTs predlowres'),save_probabilities=False, overwrite=False,num_processes_preprocessing=2,num_processes_segmentation export=2,folder_with_segs_from_prev_stage=None, num_parts=1, part_id=0)
'Dataset002_Heart/nnUNetTrainer__nnUNetPlans__3d_fullres'是数据集地址。
checkpoint name是权重文件路径,替换为在上一步的模型训练中已经得到的权重。
'Dataset002 Heart/imagesTs'是我们数据集下的测试集,把数据集名字替换为我们的名字。
'Dataset002 Heart/imagesTs predlowres'是用来保存预测结果的文件夹,需要我们提前在数据集Dataset002 Heart下创建一个名为magesTs predlowres的文件夹。
保存完以后在终端直接运行,开始推理。
就可以得到退了结果和输出。