ResNet系列模型是在2015年提出的,该网络创新性的提出了残差结构,通过堆叠多个残差结构从而构建了ResNet网络。ResNet一定程度上解决了传统的卷积网络或全连接网络或多或少存在信息丢失的问题。通过将输入信息传递给输出,确保信息完整性,使得网络深度得以不断加深的同时避免了梯度消失或爆炸的影响。ResNetv2是何凯明团队在ResNet发表后,又进一步对其网络结构进行了改进和优化,通过推导证明了前向参数和反向梯度如果直接从Residual Block传递到下一个Residual Block而不用经过ReLU等操作,效果会更好。因此调整了激活层和BN层与卷积层的运算先后顺序,并经过实验验证在深度网络中ResNetv2会有更好的收敛效果。
如下为MindSpore使用Cifar10/Cifar100数据集对ResNetv2_50/ResNetv2_101/ResNetv2_152进行训练的示例。
ResNetv2_50的整体网络架构和Resnet50的架构相仿,仅调整了激活层和BN层与卷积层的先后顺序。
使用的数据集:cifar10|cifar100
├─cifar-10-batches-bin
│
└─cifar-10-verify-bin
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
# 分布式训练
用法:
bash scripts/run_distribute_train.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [RANK_TABLE_FILE] [DATASET_PATH]
# 单机训练
用法:
bash scripts/run_standalone_train.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH]
# 运行评估示例
用法:
bash scripts/run_eval.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH] [CHECKPOINT_PATH]
# 分布式训练
用法:
bash scripts/run_distribute_train_gpu.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [RANK_TABLE_FILE] [DATASET_PATH]
# 单机训练
用法:
bash scripts/run_standalone_train_gpu.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH]
# 运行评估示例
用法:
bash scripts/run_eval_gpu.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH] [CHECKPOINT_PATH]
└──resnetv2
├── README.md
├── scripts
├── run_distribute_train_gpu.sh # 启动gpu分布式训练(8卡)
├── run_eval_gpu.sh # 启动gpu评估
├── run_standalone_train_gpu.sh # 启动gpu单机训练(单卡)
├── run_distribute_train.sh # 启动Ascend分布式训练(8卡)
├── run_eval.sh # 启动Ascend评估
└── run_standalone_train.sh # 启动Ascend单机训练(单卡)
├── src
├── config.py # 参数配置
├── dataset.py # 数据预处理
├── lr_generator.py # 生成每个步骤的学习率
└── resnetv2.py # ResNet骨干网络
├── eval.py # 评估网络
└── train.py # 训练网络
└── export.py # 导出网络
在config.py中可以同时配置训练参数和评估参数。
"class_num":10, # 数据集类数
"batch_size":32, # 输入张量的批次大小
"loss_scale":1024, # 损失等级
"momentum":0.9, # 动量优化器
"weight_decay":5e-4, # 权重衰减
"epoch_size":100, # 训练周期大小
"save_checkpoint":True, # 是否保存检查点
"save_checkpoint_epochs":5, # 两个检查点之间的周期间隔;默认情况下,最后一个检查点将在最后一个周期完成后保存
"keep_checkpoint_max":10, # 只保存最后一个keep_checkpoint_max检查点
"save_checkpoint_path":"./checkpoint", # 检查点相对于执行路径的保存路径
"low_memory": False, # 显存不足时可设置为Ture
"warmup_epochs":5, # 热身周期数
"lr_decay_mode":"cosine", # 用于生成学习率的衰减模式
"lr_init":0.1, # 基础学习率
"lr_end":0.0000000005, # 最终学习率
"lr_max":0.1, # 最大学习率
# 分布式训练
用法:
bash scripts/run_distribute_train.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [RANK_TABLE_FILE] [DATASET_PATH]
# 单机训练
用法:
bash scripts/run_standalone_train.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH]
分布式训练需要提前创建JSON格式的HCCL配置文件。
具体操作,参见hccn_tools中的说明。
# 分布式训练
用法:
bash scripts/run_distribute_train_gpu.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [RANK_TABLE_FILE] [DATASET_PATH]
# 单机训练
用法:
bash scripts/run_standalone_train_gpu.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH]
# Ascend分布式训练结果(8P)
epoch: 41 step: 195, loss is 0.17125674
epoch time: 4733.000 ms, per step time: 24.143 ms
epoch: 42 step: 195, loss is 0.0011220031
epoch time: 4735.284 ms, per step time: 24.135 ms
epoch: 43 step: 195, loss is 0.105422504
epoch time: 4737.401 ms, per step time: 24.166 ms
...
# 评估
用法:
bash scripts/run_eval.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH] [CHECKPOINT_PATH]
# 运行评估示例
用法:
bash scripts/run_eval_gpu.sh [resnetv2_50|resnetv2_101|resnetv2_152] [cifar10|cifar100] [DATASET_PATH] [CHECKPOINT_PATH]
评估结果可以在当前脚本路径下的日志中找到如下结果:
result: {'top_5_accuracy': 0.9988982371794872, 'top_1_accuracy': 0.9502283653846154}
python export.py --ckpt_file [CKPT_PATH] --file_name [FILE_NAME] --file_format [FILE_FORMAT] --dataset [cifar10|cifar100]
参数ckpt_file为必填项,
file_format
必须在 ["AIR", "MINDIR"]中选择。
推理前需参照 MindSpore C++推理部署指南 进行环境变量设置。
在执行推理前,mindir文件必须通过export.py
脚本导出。以下展示了使用mindir模型执行推理的示例。
# Ascend310 inference
bash scripts/run_infer_310.sh [MINDIR_PATH] [DATASET] [DATA_PATH] [DEVICE_ID]
DATASET
为数据集类型,如cifar10, cifar100等。DATA_PATH
为数据集路径。DEVICE_ID
可选,默认值为0。推理结果保存在脚本执行的当前路径,你可以在acc.log中看到精度计算结果。
参数 | Ascend 910 |
---|---|
模型版本 | ResNetv2_50 |
资源 | Ascend 910;CPU:2.60GHz,192核;内存:755G |
上传日期 | 2021-03-24 ; |
MindSpore版本 | 1.2.0 |
数据集 | Cifar10 |
训练参数 | epoch=135, steps per epoch=195, batch_size=32 |
优化器 | Momentum |
损失函数 | Softmax交叉熵 |
输出 | 概率 |
损失 | 0.0007279 |
速度 | 24.3毫秒/步(8卡) |
总时长 | 10分钟 |
微调检查点 | 188.36M(.ckpt文件) |
脚本 | 链接 |
dataset.py中设置了“create_dataset”函数内的种子,同时还使用了train.py中的随机种子。
请浏览官网主页。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。