深度学习模型的训练涉及几个方面
1、模型结构:模型有几层、每层多少通道数等
2、数据:数据集划分、数据文件路径、批大小、数据增强策略等
3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等
4、运行时:GPU、分布式环境配置等
5、辅助功能:如打印日志、定时保存 checkpoint等
mmpretrain的文件结构
-configs 配置文件
-data 数据集存储路径
-demo 入门案例
-docs 中英文文档教程
-mmpretrain 模块化代码
-apis: 顶层 api 接口,支持各类推理任务
-datasets:支持了各类数据集,数据变换等
-engine:支持各类钩子,优化器等训练相关组件
-evaluation:各类评测相关函数和指标计算
-models:各类算法模型的定义
-backbones 一般为图像的特征提取器,各类主千网络的定义
-necks 则为承接 backbone 和 head 之间的其它计算 (例如高维特征解码,多尺度特征融合等)
-heads 则主要为相关loss 计算和推理结果的预测
-classifier,selfsup,multimodal 则为模型高阶抽象定义
-structures: DataSample 数据结构的定义
-utils: 相关工具
-visualization:可视化的支持
-project 工程实例
-resources 图片、视频等静态资源
-tests 组件维度测试脚本
-tools 训练、测试、可视化等工具集
-work_dirs 运行代码产生的文件存放地
现有数据集+现有模型
python tools/train.py configs/resnet/resnet18_8xb16_cifar10.py
python tools/test.py configs/resnet/resnet18_8xb16_cifar10.py work_dirs/resnet18_8xb16_cifar10/epoch_200.pth
自定义模型+现有数据集
方案一:
1、使用pytorch实现完整的前向传播,并测试好维度
2、按照mmpretrain的约定将进行代码转换以及配置文件的改写
python tools/train.py work_dirs/test_8xb16_cifar10/resnet18_8xb16_cifar10.py
python tools/test.py work_dirs/test_8xb16_cifar10/resnet18_8xb16_cifar10.py work_dirs/resnet18_8xb16_cifar10/epoch_20.pth
方案二:
1、通过断点调试以及可视化的方式理解官方代码维度的变换
2、在理解的基础上直接按照约定改写官方代码
自定义模型心得:
1、虽然模型被拆分成了不同分组件,但组件之间并不能任意组合
2、各个组件的输出并不一定是Tensor,也有可能是Tuple
3、并不是每个组件都是必须的,例如可以没有neck
4、loss是和head绑定的,拆散模型时候要注意
自定义数据集+现有模型
1、数据集下载 Fruits Dataset(Images)
https://www.kaggle.com/datasets/shreyapmaher/fruits-dataset-images
python tools/train.py configs/efficientnet/efficientnet-b0_8xb32_in1k.py
出现报错,但是没有影响,只是需要拿到efficientnet-b0_8xb32_in1k.py,随后修改这个配置
修改:
(1)type=‘ImageNet’–》type=‘CustomDataset’ 4个地方
cp efficientnet-b0_8xb32_in1k.py efficientnet-b0_8xb32_fruits.py
(2)efficientnet-b0_8xb32_in1k.py–》efficientnet-b0_8xb32_fruits.py
(3)work_dir = ‘./work_dirs\efficientnet-b0_8xb32_in1k’–》work_dir = ‘./work_dirs/efficientnet-b0_8xb32_fruits’
(4)数据集路径 data_root=‘data/imagenet’–》data_root=‘data/Fruits Dataset/images’
(5)num_classes=1000–》num_classes=9
(6)split=‘train’、split='val’注释掉
(7)适当的修改num_workers、epochs、batch_size、lr等
如下:
python tools/train.py work_dirs/efficientnet-b0_8xb32_fruits.py --work-dir work_dirs/efficientnet-b0_8xb32_fruits
python tools/test.py work_dirs/efficientnet-b0_8xb32_fruits.py work_dirs/efficientnet-b0_8xb32_fruits/epoch_50.pth
resnet18_8xb32_in1k.py
名称:resnet 层数:18 8×b16:8张卡,每张卡batch_size为16 in1k:数据集名称
python tools/train.py configs/resnet/resnet18_8xb32_in1k.py
my_resnet18_8xb32_in1k.py 完整的配置文件
2、训练结果测试与验证
单张测试
python demo/image_demo.py demo/test.jpg configs/resnet/my_resnet18_8xb32_in1k_method3.py --checkpoint D:/Project_python/mmpretrain/work_dirs/my_resnet18_8xb32_in1k_method3/epoch_50.pth --show --show-dir demo --device cuda:0
批量测试
(1)测试 测试可以看详细文档教程自定义评估指标
val_evaluator = [
dict(topk=(1, 5,), type='Accuracy'),
dict(type='SingleLabelMetric', items=['precision', 'recall']),]
python tools/test.py configs/resnet/my_resnet18_8xb32_in1k_method3.py work_dirs/my_resnet18_8xb32_in1k_method3/epoch_50.pth --work-dir work_dirs/my_resnet18_8xb32_in1k_method3/val --out-item metrics --show-dir work_dirs/my_resnet18_8xb32_in1k_method3/val_result
(2)可视化模块展示 tools/visualization
browse_dataset.py: 显示在进入模型之前(类似数据增强操作)经历了什么
python tools/visualization/browse_dataset.py configs/resnet/my_resnet18_8xb32_in1k_method3.py --output-dir work_dirs/my_resnet18_8xb32_in1k_method3/browse_dataset --phase train --show-number 2 --mode original transformed concat pipeline
vis_cam.py:热力图 主要关注区域
python tools/visualization/vis_cam.py demo/roses.jpg configs/resnet/my_resnet18_8xb32_in1k_method3.py work_dirs/my_resnet18_8xb32_in1k_method3/epoch_50.pth --preview-model
data_preprocessor
backbone
.......
backbone.layer4
backbone.layer4.0
backbone.layer4.0.conv1
.......
backbone.layer4.1
backbone.layer4.1.conv1
backbone.layer4.1.bn1
backbone.layer4.1.conv2
backbone.layer4.1.bn2
backbone.layer4.1.relu
backbone.layer4.1.drop_path
neck
.......
head.fc
python tools/visualization/vis_cam.py demo/roses.jpg configs/resnet/my_resnet18_8xb32_in1k_method3.py work_dirs/my_resnet18_8xb32_in1k_method3/epoch_50.pth --target-category 2 --target-layers backbone.layer4.1.conv2 --method GradCAM/GradCAM/......
(3)分析工具 tools/analysis_tools
计算参数量
python tools/analysis_tools/get_flops.py configs/resnet/my_resnet18_8xb32_in1k_method3.py --shape 224 224
日志分析
python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/my_resnet18_8xb32_in1k_method3/20230929_151247/vis_data/20230929_151247.json --keys loss accuracy/top1
python tools/analysis_tools/analyze_logs.py cal_train_time work_dirs/my_resnet18_8xb32_in1k_method3/20230929_151247/vis_data/20230929_151247.json
生成pkl文件
python tools/test.py configs/resnet/my_resnet18_8xb32_in1k_method3.py work_dirs/my_resnet18_8xb32_in1k_method3/epoch_50.pth --out work_dirs/my_resnet18_8xb32_in1k_method3/result.pkl
验证预测失败和成功的图
python tools/analysis_tools/analyze_results.py configs/resnet/my_resnet18_8xb32_in1k_method3.py work_dirs/my_resnet18_8xb32_in1k_method3/result.pkl --out-dir work_dirs/my_resnet18_8xb32_in1k_method3/analyze
画混淆矩阵图
python tools/analysis_tools/confusion_matrix.py configs/resnet/my_resnet18_8xb32_in1k_method3.py work_dirs/my_resnet18_8xb32_in1k_method3/result.pkl --show --include-values