# ResNeSt50-GPU **Repository Path**: xb9919/ResNeSt50-GPU ## Basic Information - **Project Name**: ResNeSt50-GPU - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-15 - **Last Updated**: 2022-02-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 目录 - [目录](#目录) - [ResNeSt说明](#resnest说明) - [模型架构](#模型架构) - [数据集](#数据集) - [特性](#特性) - [混合精度](#混合精度) - [环境要求](#环境要求) - [脚本说明](#脚本说明) - [脚本及样例代码](#脚本及样例代码) - [脚本参数](#脚本参数) - [训练过程](#训练过程) - [用法](#训练用法) - [样例](#训练样例) - [评估过程](#评估过程) - [用法](#评估用法) - [样例](#评估样例) - [结果](#评估结果) - [模型描述](#模型描述) - [性能](#性能) - [训练性能](#训练性能) - [推理性能](#推理性能) - [随机情况说明](#随机情况说明) - [ModelZoo主页](#modelzoo主页) # ResNeSt说明 ResNeSt是一个高度模块化的图像分类网络架构。ResNeSt的设计为统一的、多分支的架构,该架构仅需设置几个超参数。此策略提供了一个新维度,我们将其称为“基数”(转换集的大小),它是深度和宽度维度之外的一个重要因素。 [论文](https://arxiv.org/abs/2004.08955): Hang Zhang, Chongruo Wu, Alexander Smola et al. ResNeSt: Split-Attention Networks. 2020. # 模型架构 ResNeSt整体网络架构如下: [链接](https://arxiv.org/abs/2004.08955) # 数据集 使用的数据集:[ImageNet](http://www.image-net.org/) - 数据集大小:共1000个类,包含128万张彩色图像 - 训练集:120G,128万张图像 - 测试集:5G,5万张图像 - 数据格式:RGB图像。 - 注:数据在src/datasets中处理。 # 特性 ## 混合精度 采用[混合精度](https://www.mindspore.cn/docs/programming_guide/zh-CN/master/enable_mixed_precision.html)的训练方法使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。 以FP16算子为例,如果输入数据类型为FP32,MindSpore后台会自动降低精度来处理数据。用户可打开INFO日志,搜索“reduce precision”查看精度降低的算子。 # 环境要求 - 硬件(GPU) - 使用GPU处理器来搭建硬件环境。 - 框架 - [MindSpore](https://www.mindspore.cn/install) - 如需查看详情,请参见如下资源: - [MindSpore教程](https://www.mindspore.cn/tutorials/zh-CN/master/index.html) - [MindSpore Python API](https://www.mindspore.cn/docs/api/zh-CN/master/index.html) # 脚本说明 ## 脚本及样例代码 ```path . └─ResNeSt50 ├─README.md ├─scripts ├─run_train.sh ├─run_eval.sh ├─run_distribute_train.sh # 启动GPU分布式训练(8卡) ├─run_distribute_eval.sh # 启动GPU分布式评估(8卡) ├─src ├─datasets ├─autoaug.py # 随机数据增强方法 ├─dataset.py # 数据集处理 ├─models ├─resnest.py # ResNeSt50网络定义 ├─resnet.py # 主干网络 ├─splat.py # split-attention ├─utils.py # 工具函数:网络获取、加载权重等 ├─config.py # 参数配置 ├─crossentropy.py # 交叉熵损失函数 ├─eval_callback.py # 推理信息打印 ├─logging.py # 日志记录 ├──eval.py # 评估网络 ├──train.py # 训练网络 ├──export.py # 导出Mindir接口 ├──postprocess.py # 后处理 ├──README.md # README文件 ``` ## 脚本参数 在config.py中可以同时配置训练和评估参数。 ```python "net_name": 'resnest50' # 网络选择 "root": "/home/mindspore/dataset/imagenet_original" # 数据集路径 "num_classes": 1000, # 数据集类数 "base_size": 224, # 图像大小 "crop_size": 224, # crop大小 "label_smoothing": 0.1, # 标签平滑 "batch_size": 64, # 输入张量的批次大小,不能超过64 "test_batch_size": 64, # 测试批次大小 "last_gamma": True, # zero bn last gamma "final_drop": 1.0, # final_drop "epochs": 270, # epochs "start_epoch": 0, # start epochs "num_workers": 64, # num_workers "lr": 0.025, # 基础学习率,多卡训练乘以卡数 "lr_scheduler": 'cosine_annealing', # 学习率模式 "lr_epochs": '30,60,90,120,150,180,210,240,270', # LR变化轮次 "lr_gamma": 0.1, # 减少LR的exponential lr_scheduler因子 "eta_min": 0, # cosine_annealing调度器中的eta_min "T_max": 270, # cosine_annealing调度器中的T-max "max_epoch": 270, # 训练模型的最大轮次数量 "warmup_epochs" : 5, # 热身轮次 "weight_decay": 0.0001, # 权重衰减 "momentum": 0.9, # 动量 "is_dynamic_loss_scale": 0, # 动态损失放大 "loss_scale": 1024, # 损失放大 "disable_bn_wd": True, # batchnorm no weight decay ``` ## 训练过程 ### 训练用法 首先需要在`src/config.py`中设置好超参数以及数据集路径等参数,接着可以通过脚本或者.py文件进行训练 您可以通过python脚本开始训练: ```shell python train.py --outdir ./output --device_target GPU ``` 或通过shell脚本开始训练: ```shell GPU: # 分布式训练示例(8卡) bash run_distribute_train.sh [DATA_PATH] [DEVICE_NUM] # 单机训练 bash run_train.sh [DATA_PATH] ``` ### 训练样例 ```shell # Ascend分布式训练示例(8卡) bash scripts/run_distribute_train.sh dataset/imagenet_original 8 # Ascend单机训练示例 bash scripts/run_train.sh dataset/imagenet_original ``` 您可以在日志中找到检查点文件和结果。 ## 评估过程 ### 评估用法 您可以通过python脚本开始评估: ```shell python eval.py --outdir ./output1 --resume_path ./output/ckpt_0/resnest50-270_2502.ckpt ``` 或通过shell脚本开始训练: ```shell # 评估 bash run_eval.sh OUT_DIR PRETRAINED_CKPT_PATH ``` PLATFORM is GPU, default is GPU. ### 评估样例 ```shell # 检查点评估 bash scripts/run_eval.sh OUT_DIR PRETRAINED_CKPT_PATH #或者直接使用脚本运行 python eval.py --outdir ./output --resume_path ~/resnest50-270_2502.ckpt ``` ### 评估结果 评估结果保存在脚本路径`/output1/valid`下。您可以在日志中找到类似以下的结果。 ```2022-01-30 12:10:33,478:INFO:Inference Performance: 379.23 img/sec 2022-01-30 12:10:33,478:INFO:before results=[[40525], [47716], [49984]] 2022-01-30 12:10:33,479:INFO:after results=[[40525] [47716] [49984]] 2022-01-30 12:10:33,479:INFO:after allreduce eval: top1_correct=40525, tot=49984,acc=81.08%(TOP1) 2022-01-30 12:10:33,479:INFO:after allreduce eval: top5_correct=47716, tot=49984,acc=95.46%(TOP5) ``` # 模型描述 ## 性能 ### 训练性能 | 参数 | ResNeSt50 | | -------------------------- | ---------------------------------------------------------- | | 资源 | GeForce RTX 3090 ;CPU 2.90GHz,16cores;内存,252G | | 上传日期 | 2022-2-15 | | MindSpore版本 | 1.5 | | 数据集 | ImageNet | | 训练参数 | src/config.py | | 优化器 | Momentum | | 损失函数 | Softmax交叉熵 | | 损失 | 1.5859 | | 准确率 | 81.08%(TOP1) | | 总时长 | 66h42m42s185(8卡) | | 调优检查点 | 212 M(.ckpt文件) | ### 推理性能 | 参数 | | | -------------------------- | -------------------- | | 资源 | GeForce RTX 3090 | | 上传日期 | 2022-2-15 | | MindSpore版本 | 1.5 | | 数据集 | ImageNet, 5万 | | batch_size | 1 | | 输出 | 分类准确率 | | 准确率 | acc=81.08%(TOP1) | # 随机情况说明 dataset.py中设置了“ImageNet”函数内的种子,同时还使用了train.py中的随机种子。 # ModelZoo主页 请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。