!10667 Add CN readme of densenet121 and inceptionv3

From: @zhouyaqiang0
Reviewed-by: @oacjiewen
Signed-off-by:
This commit is contained in:
mindspore-ci-bot 2021-01-05 15:46:25 +08:00 committed by Gitee
commit f4ee467d77
2 changed files with 510 additions and 0 deletions

View File

@ -0,0 +1,258 @@
# 目录
<!-- TOC -->
- [目录](#目录)
- [DenseNet121描述](#densenet121描述)
- [模型架构](#模型架构)
- [数据集](#数据集)
- [特性](#特性)
- [混合精度](#混合精度)
- [环境要求](#环境要求)
- [快速入门](#快速入门)
- [脚本说明](#脚本说明)
- [脚本及样例代码](#脚本及样例代码)
- [脚本参数](#脚本参数)
- [训练过程](#训练过程)
- [训练](#训练)
- [分布式训练](#分布式训练)
- [评估过程](#评估过程)
- [评估](#评估)
- [模型描述](#模型描述)
- [性能](#性能)
- [训练准确率结果](#训练准确率结果)
- [训练性能结果](#训练性能结果)
- [随机情况说明](#随机情况说明)
- [ModelZoo主页](#modelzoo主页)
<!-- /TOC -->
# DenseNet121描述
DenseNet-121是一个基于卷积的神经网络用于图像分类。有关该模型的描述可查阅[此论文](https://arxiv.org/abs/1608.06993)。华为的DenseNet-121是[MindSpore](https://www.mindspore.cn/)上的一个实现。
仓库中还包含用于启动训练和推理例程的脚本。
# 模型架构
DenseNet-121构建在4个密集连接块上。各个密集块中每个层都会接受其前面所有层作为其额外的输入并将自己的特征映射传递给后续所有层。会使用到级联。每一层都从前几层接受“集体知识”。
# 数据集
使用的数据集: ImageNet
数据集的默认配置如下:
- 训练数据集预处理:
- 图像的输入尺寸224\*224
- 裁剪的原始尺寸大小范围(最小值,最大值):(0.08, 1.0)
- 裁剪的宽高比范围(最小值,最大值):(0.75, 1.333)
- 图像翻转概率0.5
- 随机调节亮度、对比度、饱和度:(0.4, 0.4, 0.4)
- 根据平均值和标准偏差对输入图像进行归一化
- 测试数据集预处理:
- 图像的输入尺寸224\*224将图像缩放到256\*256然后在中央区域裁剪图像
- 根据平均值和标准偏差对输入图像进行归一化
# 特性
## 混合精度
采用[混合精度](https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/enable_mixed_precision.html)的训练方法使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。
以FP16算子为例如果输入数据类型为FP32MindSpore后台会自动降低精度来处理数据。用户可打开INFO日志搜索“reduce precision”查看精度降低的算子。
# 环境要求
- 硬件Ascend
- 准备Ascend AI处理器搭建硬件环境。如需试用昇腾处理器请发送[申请表](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/file/other/Ascend%20Model%20Zoo%E4%BD%93%E9%AA%8C%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E8%A1%A8.docx)至ascend@huawei.com审核通过即可获得资源。
- 框架
- [MindSpore](https://www.mindspore.cn/install)
- 如需查看详情,请参见如下资源:
- [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
- [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
# 快速入门
通过官方网站安装MindSpore后您可以按照如下步骤进行训练和评估
```python
# 训练示例
python train.py --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/PRETRAINED_CKPT --is_distributed 0 > train.log 2>&1 &
# 分布式训练示例
sh scripts/run_distribute_train.sh 8 rank_table.json /PATH/TO/DATASET /PATH/TO/PRETRAINED_CKPT
# 评估示例
python eval.py --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/CHECKPOINT > eval.log 2>&1 &
OR
sh scripts/run_distribute_eval.sh 8 rank_table.json /PATH/TO/DATASET /PATH/TO/CHECKPOINT
```
分布式训练需要提前创建JSON格式的HCCL配置文件。
请遵循以下链接中的说明:
[链接](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools)
# 脚本说明
## 脚本及样例代码
```shell
├── model_zoo
├── README.md // 所有模型的说明
├── densenet121
├── README.md // DenseNet-121相关说明
├── scripts
│ ├── run_distribute_train.sh // Ascend分布式shell脚本
│ ├── run_distribute_eval.sh // Ascend评估shell脚本
├── src
│ ├── datasets // 数据集处理函数
│ ├── losses
│ ├──crossentropy.py // DenseNet损失函数
│ ├── lr_scheduler
│ ├──lr_scheduler.py // DenseNet学习率调度函数
│ ├── network
│ ├──densenet.py // DenseNet架构
│ ├──optimizers // DenseNet优化函数
│ ├──utils
│ ├──logging.py // 日志函数
│ ├──var_init.py // DenseNet变量init函数
│ ├── config.py // 网络配置
├── train.py // 训练脚本
├── eval.py // 评估脚本
```
## 脚本参数
可通过`train.py`脚本中的参数修改训练行为。`train.py`脚本中的参数如下:
```param
--Data_dir 训练数据目录
--num_classes 数据集中的类个数默认为1000
--image_size 数据集图片大小
--per_batch_size 每GPU的迷你批次大小默认为256
--pretrained 预训练模型的路径
--lr_scheduler LR调度类型取值包括 exponentialcosine_annealing
--lr 初始学习率
--lr_epochs lr变化的轮次里程碑
--lr_gamma 通过 exponential lr_scheduler因子减少lr
--eta_min cosine_annealing scheduler中的eta_min
--T_max cosine_annealing scheduler中的T_max
--max_epoch 训练模型的最大轮次数
--warmup_epochs 热身轮次数当batchsize较大时)
--weight_decay 权重衰减(默认值1e-4
--momentum 动量(默认值0.9
--label_smooth 是否在CE中使用标签平滑
--label_smooth_factor 原始one-hot平滑强度
--log_interval 日志记录间隔默认为100
--ckpt_path 存放检查点的路径
--ckpt_interval 保存检查点的间隔
--is_save_on_master 在master或all rank上保存检查点
--is_distributed 是否为多卡默认为1
--rank 分布式local rank默认为0
--group_size 分布式world size默认为1
```
## 训练过程
### 训练
- Ascend处理器环境运行
```python
python train.py --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/PRETRAINED_CKPT --is_distributed 0 > train.log 2>&1 &
```
以上python命令在后台运行在`output/202x-xx-xx_time_xx_xx/`目录下生成日志和模型检查点。损失值的实现如下:
```log
2020-08-22 16:58:56,617:INFO:epoch[0], iter[5003], loss:4.367, mean_fps:0.00 imgs/sec
2020-08-22 16:58:56,619:INFO:local passed
2020-08-22 17:02:19,920:INFO:epoch[1], iter[10007], loss:3.193, mean_fps:6301.11 imgs/sec
2020-08-22 17:02:19,921:INFO:local passed
2020-08-22 17:05:43,112:INFO:epoch[2], iter[15011], loss:3.096, mean_fps:6304.53 imgs/sec
2020-08-22 17:05:43,113:INFO:local passed
...
```
### 分布式训练
- Ascend处理器环境运行
```shell
sh scripts/run_distribute_train.sh 8 rank_table.json /PATH/TO/DATASET /PATH/TO/PRETRAINED_CKPT
```
上述shell脚本将在后台进行分布式训练。可以通过文件`train[X]/output/202x-xx-xx_time_xx_xx_xx/`查看结果日志和模型检查点。损失值的实现如下:
```log
2020-08-22 16:58:54,556:INFO:epoch[0], iter[5003], loss:3.857, mean_fps:0.00 imgs/sec
2020-08-22 17:02:19,188:INFO:epoch[1], iter[10007], loss:3.18, mean_fps:6260.18 imgs/sec
2020-08-22 17:05:42,490:INFO:epoch[2], iter[15011], loss:2.621, mean_fps:6301.11 imgs/sec
2020-08-22 17:09:05,686:INFO:epoch[3], iter[20015], loss:3.113, mean_fps:6304.37 imgs/sec
2020-08-22 17:12:28,925:INFO:epoch[4], iter[25019], loss:3.29, mean_fps:6303.07 imgs/sec
2020-08-22 17:15:52,167:INFO:epoch[5], iter[30023], loss:2.865, mean_fps:6302.98 imgs/sec
...
...
```
## 评估过程
### 评估
- Ascend处理器环境
运行以下命令进行评估。
```eval
python eval.py --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/CHECKPOINT > eval.log 2>&1 &
OR
sh scripts/run_distribute_eval.sh 8 rank_table.json /PATH/TO/DATASET /PATH/TO/CHECKPOINT
```
上述python命令在后台运行。可以通过“output/202x-xx-xx_time_xx_xx_xx/202x_xxxx.log”文件查看结果。测试数据集的准确率如下
```log
2020-08-24 09:21:50,551:INFO:after allreduce eval: top1_correct=37657, tot=49920, acc=75.43%
2020-08-24 09:21:50,551:INFO:after allreduce eval: top5_correct=46224, tot=49920, acc=92.60%
```
# 模型描述
## 性能
### 训练准确率结果
| 参数 | DenseNet |
| ------------------- | --------------------------- |
| 模型版本 | Inception V1 |
| 资源 | Ascend 910 |
| 上传日期 | 2020/9/15 |
| MindSpore版本 | 1.0.0 |
| 数据集 | ImageNet |
| 轮次 | 120 |
| 输出 | 概率 |
| 训练性能 | Top175.13% Top592.57% |
### 训练性能结果
| 参数 | DenseNet |
| ------------------- | --------------------------- |
| 模型版本 | Inception V1 |
| 资源 | Ascend 910 |
| 上传日期 | 2020/9/15 |
| MindSpore版本 | 1.0.0 |
| 数据集 | ImageNet |
| batch_size | 32 |
| 输出 | 概率 |
| 速度 | 单卡760 img/s8卡6000 img/s |
# 随机情况说明
dataset.py中设置了“create_dataset”函数内的种子同时还使用了train.py中的随机种子。
# ModelZoo主页
请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。

View File

@ -0,0 +1,252 @@
# 目录
<!-- TOC -->
- [目录](#目录)
- [InceptionV3描述](#inceptionv3描述)
- [模型架构](#模型架构)
- [数据集](#数据集)
- [特性](#特性)
- [混合精度Ascend](#混合精度ascend)
- [环境要求](#环境要求)
- [脚本说明](#脚本说明)
- [脚本和样例代码](#脚本和样例代码)
- [脚本参数](#脚本参数)
- [训练过程](#训练过程)
- [用法](#用法)
- [启动](#启动)
- [结果](#结果)
- [评估过程](#评估过程)
- [用法](#用法-1)
- [启动](#启动-1)
- [结果](#结果-1)
- [模型描述](#模型描述)
- [性能](#性能)
- [训练性能](#训练性能)
- [推理性能](#推理性能)
- [随机情况说明](#随机情况说明)
- [ModelZoo主页](#modelzoo主页)
<!-- /TOC -->
# InceptionV3描述
Google的InceptionV3是深度学习卷积架构系列的第3个版本。InceptionV3主要通过修改以前的Inception架构来减少计算资源的消耗。这个想法是在2015年出版的Rethinking the Inception Architecture for Computer Vision, published in 2015一文中提出的。
[论文](https://arxiv.org/pdf/1512.00567.pdf) Min Sun, Ali Farhadi, Steve Seitz.Ranking Domain-Specific Highlights by Analyzing Edited Videos[J].2014.
# 模型架构
InceptionV3的总体网络架构如下
[链接](https://arxiv.org/pdf/1512.00567.pdf)
# 数据集
所用数据集可参照论文。
- 数据集大小125G共1000个类、125万张彩色图像
- 训练集120G, 120万张图像
- 测试集5G共5万张图像
- 数据格式RGB
- 注数据将在src/dataset.py中处理。
# 特性
## 混合精度Ascend
采用[混合精度](https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/enable_mixed_precision.html)的训练方法使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。
以FP16算子为例如果输入数据类型为FP32MindSpore后台会自动降低精度来处理数据。用户可打开INFO日志搜索“reduce precision”查看精度降低的算子。
# 环境要求
- 硬件Ascend
- 使用Ascend来搭建硬件环境。如需试用Ascend处理器请发送[申请表](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/file/other/Ascend%20Model%20Zoo%E4%BD%93%E9%AA%8C%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E8%A1%A8.docx)至ascend@huawei.com审核通过即可获得资源。
- 框架
- [MindSpore](https://www.mindspore.cn/install/en)
- 如需查看详情,请参见如下资源:
- [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
- [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
# 脚本说明
## 脚本和样例代码
```shell
.
└─Inception-v3
├─README.md
├─scripts
├─run_standalone_train.sh # 启动Ascend单机训练单卡
├─run_distribute_train.sh # 启动Ascend分布式训练8卡
├─run_eval.sh # 启动Ascend评估
├─src
├─config.py # 参数配置
├─dataset.py # 数据预处理
├─inception_v3.py # 网络定义
├─loss.py # 自定义交叉熵损失函数
├─lr_generator.py # 学习率生成器
├─eval.py # 评估网络
├─export.py # 转换检查点
└─train.py # 训练网络
```
## 脚本参数
```python
train.py和config.py中主要参数如下
'random_seed' # 修复随机种子
'rank' # 分布式的本地序号
'group_size' # 分布式进程总数
'work_nums' # 读取数据的worker个数
'decay_method' # 学习率调度器模式
"loss_scale" # 损失等级
'batch_size' # 输入张量的批次大小
'epoch_size' # 总轮次数
'num_classes' # 数据集类数
'smooth_factor' # 标签平滑因子
'aux_factor' # aux logit的损耗因子
'lr_init' # 初始学习率
'lr_max' # 最大学习率
'lr_end' # 最小学习率
'warmup_epochs' # 热身轮次数
'weight_decay' # 权重衰减
'momentum' # 动量
'opt_eps' # epsilon
'keep_checkpoint_max' # 保存检查点的最大数量
'ckpt_path' # 保存检查点路径
'is_save_on_master' # 保存Rank0的检查点分布式参数
'dropout_keep_prob' # 保持率介于0和1之间例如keep_prob = 0.9表示放弃10%的输入单元
'has_bias' # 层是否使用偏置向量
'amp_level' # `mindspore.amp.build_train_network`中参数`level`的选项level表示混合
# 精准训练支持[O0, O2, O3]
```
## 训练过程
### 用法
使用python或shell脚本开始训练。shell脚本的用法如下
- Ascend
```shell
# 分布式训练示例(8卡)
sh scripts/run_distribute_train.sh RANK_TABLE_FILE DATA_PATH
# 单机训练
sh scripts/run_standalone_train.sh DEVICE_ID DATA_PATH
```
> 注RANK_TABLE_FILE可参考[链接](https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/distributed_training_ascend.html)。device_ip可以通过[链接](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools)获取
> 这是关于device_num和处理器总数的处理器核绑定操作。如不需要请删除scripts/run_distribute_train.sh中的taskset操作。
### 启动
``` launch
# 训练示例
python:
Ascend: python train.py --dataset_path /dataset/train --platform Ascend
shell:
Ascend:
# 分布式训练示例(8卡)
sh scripts/run_distribute_train.sh RANK_TABLE_FILE DATA_PATH
# 单机训练
sh scripts/run_standalone_train.sh DEVICE_ID DATA_PATH
```
### 结果
训练结果保存在示例路径。检查点默认保存在`checkpoint`,训练日志会重定向到`./log.txt`,如下:
```log
epoch:0 step:1251, loss is 5.7787247
Epoch time:360760.985, per step time:288.378
epoch:1 step:1251, loss is 4.392868
Epoch time:160917.911, per step time:128.631
```
## 评估过程
### 用法
使用python或shell脚本开始训练。shell脚本的用法如下
- Ascend
```shell
sh scripts/run_eval.sh DEVICE_ID DATA_DIR PATH_CHECKPOINT
```
### 启动
``` launch
# 评估示例
python:
Ascend: python eval.py --dataset_path DATA_DIR --checkpoint PATH_CHECKPOINT --platform Ascend
shell:
Ascend: sh scripts/run_eval.sh DEVICE_ID DATA_DIR PATH_CHECKPOINT
```
> 训练过程中可以生成检查点。
### 结果
推理结果保存在示例路径,可以在`eval.log`中找到如下结果。
```log
metric:{'Loss':1.778, 'Top1-Acc':0.788, 'Top5-Acc':0.942}
```
# 模型描述
## 性能
### 训练性能
| 参数 | Ascend |
| -------------------------- | ---------------------------------------------- |
| 模型版本 | InceptionV3 |
| 资源 | Ascend 910, CPU:2.60GHz192核内存755G |
| 上传日期 | 2020-08-21 |
| MindSpore版本 | 0.6.0-beta |
| 数据集 | 120万张图像 |
| Batch_size | 128 |
| 训练参数 | src/config.py |
| 优化器 | RMSProp |
| 损失函数 | Softmax交叉熵 |
| 输出 | 概率 |
| 损失 | 1.98 |
| 总时长8卡 | 11小时 |
| 参数(M) | 103M |
| 微调检查点 | 313M |
| 训练速度 | 单卡1050img/s;8卡8000 img/s |
| 脚本 | [inceptionv3脚本](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/inceptionv3) |
#### 推理性能
| 参数 | Ascend |
| ------------------- | --------------------------- |
| 模型版本 | InceptionV3 |
| 资源 | Ascend 910CPU 2.60GHz192核内存755G |
| 上传日期 | 2020-08-22 |
| MindSpore 版本 | 0.6.0-beta |
| 数据集 | 5万张图像 |
| Batch_size | 128 |
| 输出 | 概率 |
| 准确率 | ACC1[78.8%] ACC5[94.2%] |
| 总时长 | 2分钟 |
| 推理模型 | 92M (.onnx文件) |
# 随机情况说明
在dataset.py中我们设置了“create_dataset”函数内的种子同时还使用了train.py中的随机种子。
# ModelZoo主页
请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。