You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README_CN.md 16 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. # 目录
  2. <!-- TOC -->
  3. - [目录](#目录)
  4. - [DenseNet描述](#densenet描述)
  5. - [模型架构](#模型架构)
  6. - [数据集](#数据集)
  7. - [特性](#特性)
  8. - [混合精度](#混合精度)
  9. - [环境要求](#环境要求)
  10. - [快速入门](#快速入门)
  11. - [脚本说明](#脚本说明)
  12. - [脚本及样例代码](#脚本及样例代码)
  13. - [脚本参数](#脚本参数)
  14. - [训练过程](#训练过程)
  15. - [训练](#训练)
  16. - [分布式训练](#分布式训练)
  17. - [评估过程](#评估过程)
  18. - [评估](#评估)
  19. - [模型描述](#模型描述)
  20. - [性能](#性能)
  21. - [训练准确率结果](#训练准确率结果)
  22. - [训练性能结果](#训练性能结果)
  23. - [随机情况说明](#随机情况说明)
  24. - [ModelZoo主页](#modelzoo主页)
  25. <!-- /TOC -->
  26. # DenseNet描述
  27. DenseNet是一个基于卷积的神经网络,用于图像分类。有关该模型的描述,可查阅[此论文](https://arxiv.org/abs/1608.06993)。华为的DenseNet是[MindSpore](https://www.mindspore.cn/)上的一个实现。
  28. 仓库中还包含用于启动训练和推理例程的脚本。
  29. # 模型架构
  30. DenseNet模型支持两种模式:DenseNet-100 和DenseNet-121。数字表示网络中包含的卷积层数量。
  31. DenseNet-121构建在4个密集连接块上, DenseNet-100则构建在3个密集连接块上。各个密集块中,每个层都会接受其前面所有层作为其额外的输入,并将自己的特征映射传递给后续所有层。会使用到级联。每一层都从前几层接受“集体知识”。
  32. # 数据集
  33. DenseNet-121使用的数据集: ImageNet
  34. 数据集的默认配置如下:
  35. - 训练数据集预处理:
  36. - 图像的输入尺寸:224\*224
  37. - 裁剪的原始尺寸大小范围(最小值,最大值):(0.08, 1.0)
  38. - 裁剪的宽高比范围(最小值,最大值):(0.75, 1.333)
  39. - 图像翻转概率:0.5
  40. - 随机调节亮度、对比度、饱和度:(0.4, 0.4, 0.4)
  41. - 根据平均值和标准偏差对输入图像进行归一化
  42. - 测试数据集预处理:
  43. - 图像的输入尺寸:224\*224(将图像缩放到256\*256,然后在中央区域裁剪图像)
  44. - 根据平均值和标准偏差对输入图像进行归一化
  45. DenseNet-100使用的数据集: Cifar-10
  46. 数据集的默认配置如下:
  47. - 训练数据集预处理:
  48. - 图像的输入尺寸:32\*32
  49. - 随机裁剪的边界填充值:4
  50. - 图像翻转概率:0.5
  51. - 随机调节亮度、对比度、饱和度:(0.4, 0.4, 0.4)
  52. - 根据平均值和标准偏差对输入图像进行归一化
  53. - 测试数据集预处理:
  54. - 图像的输入尺寸:32\*32
  55. - 根据平均值和标准偏差对输入图像进行归一化
  56. # 特性
  57. ## 混合精度
  58. 采用[混合精度](https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/enable_mixed_precision.html)的训练方法使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。
  59. 以FP16算子为例,如果输入数据类型为FP32,MindSpore后台会自动降低精度来处理数据。用户可打开INFO日志,搜索“reduce precision”查看精度降低的算子。
  60. # 环境要求
  61. - 硬件(Ascend/GPU)
  62. - 准备Ascend或GPU处理器搭建硬件环境。
  63. - 框架
  64. - [MindSpore](https://www.mindspore.cn/install)
  65. - 如需查看详情,请参见如下资源:
  66. - [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
  67. - [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
  68. # 快速入门
  69. 通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
  70. - Ascend处理器环境运行
  71. ```python
  72. # 训练示例
  73. python train.py --net [NET_NAME] --dataset [DATASET_NAME] --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/PRETRAINED_CKPT --is_distributed 0 > train.log 2>&1 &
  74. # 分布式训练示例
  75. sh scripts/run_distribute_train.sh 8 rank_table.json [NET_NAME] [DATASET_NAME] /PATH/TO/DATASET /PATH/TO/PRETRAINED_CKPT
  76. # 评估示例
  77. python eval.py --net [NET_NAME] --dataset [DATASET_NAME] --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/CHECKPOINT > eval.log 2>&1 &
  78. OR
  79. sh scripts/run_distribute_eval.sh 8 rank_table.json [NET_NAME] [DATASET_NAME] /PATH/TO/DATASET /PATH/TO/CHECKPOINT
  80. ```
  81. 分布式训练需要提前创建JSON格式的HCCL配置文件。
  82. 请遵循以下链接中的说明:
  83. [链接](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools)
  84. - GPU处理器环境运行
  85. ```python
  86. # 训练示例
  87. export CUDA_VISIBLE_DEVICES=0
  88. python train.py --net=[NET_NAME] --dataset=[DATASET_NAME] --data_dir=[DATASET_PATH] --is_distributed=0 --device_target='GPU' > train.log 2>&1 &
  89. # 分布式训练示例
  90. sh run_distribute_train_gpu.sh 8 0,1,2,3,4,5,6,7 [NET_NAME] [DATASET_NAME] [DATASET_PATH]
  91. # 评估示例
  92. python eval.py --net=[NET_NAME] --dataset=[DATASET_NAME] --data_dir=[DATASET_PATH] --device_target='GPU' --pretrained=[CHECKPOINT_PATH] > eval.log 2>&1 &
  93. OR
  94. sh run_distribute_eval_gpu.sh 1 0 [NET_NAME] [DATASET_NAME] [DATASET_PATH] [CHECKPOINT_PATH]
  95. ```
  96. # 脚本说明
  97. ## 脚本及样例代码
  98. ```shell
  99. ├── model_zoo
  100. ├── README.md // 所有模型的说明
  101. ├── densenet
  102. ├── README.md // DenseNet相关说明
  103. ├── scripts
  104. │ ├── run_distribute_train.sh // Ascend分布式shell脚本
  105. │ ├── run_distribute_train_gpu.sh // GPU分布式shell脚本
  106. │ ├── run_distribute_eval.sh // Ascend评估shell脚本
  107. │ ├── run_distribute_eval_gpu.sh // GPU评估shell脚本
  108. ├── src
  109. │ ├── datasets // 数据集处理函数
  110. │ ├── losses
  111. │ ├──crossentropy.py // DenseNet损失函数
  112. │ ├── lr_scheduler
  113. │ ├──lr_scheduler.py // DenseNet学习率调度函数
  114. │ ├── network
  115. │ ├──densenet.py // DenseNet架构
  116. │ ├──optimizers // DenseNet优化函数
  117. │ ├──utils
  118. │ ├──logging.py // 日志函数
  119. │ ├──var_init.py // DenseNet变量init函数
  120. │ ├── config.py // 网络配置
  121. ├── train.py // 训练脚本
  122. ├── eval.py // 评估脚本
  123. ```
  124. ## 脚本参数
  125. 可通过`train.py`脚本中的参数修改训练行为。`train.py`脚本中的参数如下:
  126. ```param
  127. --data_dir 训练数据目录
  128. --num_classes 数据集中的类个数(DenseNet-121中默认为1000,DenseNet-100中默认为10)
  129. --image_size 数据集图片大小
  130. --per_batch_size 每GPU的迷你批次大小(DenseNet-121中默认为32, DenseNet-100中默认为64)
  131. --pretrained 预训练模型的路径
  132. --lr_scheduler LR调度类型,取值包括 exponential,cosine_annealing
  133. --lr 初始学习率
  134. --lr_epochs lr变化的轮次里程碑
  135. --lr_gamma 通过 exponential lr_scheduler因子减少lr
  136. --eta_min cosine_annealing scheduler中的eta_min
  137. --T_max cosine_annealing scheduler中的T_max
  138. --max_epoch 训练模型的最大轮次数
  139. --warmup_epochs 热身轮次数(当batchsize较大时)
  140. --weight_decay 权重衰减(默认值:1e-4)
  141. --momentum 动量(默认值:0.9)
  142. --label_smooth 是否在CE中使用标签平滑
  143. --label_smooth_factor 原始one-hot平滑强度
  144. --log_interval 日志记录间隔(默认为100)
  145. --ckpt_path 存放检查点的路径
  146. --ckpt_interval 保存检查点的间隔
  147. --is_save_on_master 在master或all rank上保存检查点
  148. --is_distributed 是否为多卡(默认为1)
  149. --rank 分布式local rank(默认为0)
  150. --group_size 分布式world size(默认为1)
  151. ```
  152. ## 训练过程
  153. ### 训练
  154. - Ascend处理器环境运行
  155. ```python
  156. python train.py --net [NET_NAME] --dataset [DATASET_NAME] --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/PRETRAINED_CKPT --is_distributed 0 > train.log 2>&1 &
  157. ```
  158. 以上python命令在后台运行,在`output/202x-xx-xx_time_xx_xx/`目录下生成日志和模型检查点。在ImageNet数据集上训练DenseNet-121的损失值的实现如下:
  159. ```log
  160. 2020-08-22 16:58:56,617:INFO:epoch[0], iter[5003], loss:4.367, mean_fps:0.00 imgs/sec
  161. 2020-08-22 16:58:56,619:INFO:local passed
  162. 2020-08-22 17:02:19,920:INFO:epoch[1], iter[10007], loss:3.193, mean_fps:6301.11 imgs/sec
  163. 2020-08-22 17:02:19,921:INFO:local passed
  164. 2020-08-22 17:05:43,112:INFO:epoch[2], iter[15011], loss:3.096, mean_fps:6304.53 imgs/sec
  165. 2020-08-22 17:05:43,113:INFO:local passed
  166. ...
  167. ```
  168. - GPU处理器环境运行
  169. ```python
  170. export CUDA_VISIBLE_DEVICES=0
  171. python train.py --net=[NET_NAME] --dataset=[DATASET_NAME] --data_dir=[DATASET_PATH] --is_distributed=0 --device_target='GPU' > train.log 2>&1 &
  172. ```
  173. 以上python命令在后台运行,在`output/202x-xx-xx_time_xx_xx/`目录下生成日志和模型检查点。
  174. - CPU处理器环境运行
  175. ```python
  176. python train.py --net=[NET_NAME] --dataset=[DATASET_NAME] --data_dir=[DATASET_PATH] --is_distributed=0 --device_target='CPU' > train.log 2>&1 &
  177. ```
  178. 以上python命令在后台运行,在`output/202x-xx-xx_time_xx_xx/`目录下生成日志和模型检查点。
  179. ### 分布式训练
  180. - Ascend处理器环境运行
  181. ```shell
  182. sh scripts/run_distribute_train.sh 8 rank_table.json [NET_NAME] [DATASET_NAME] /PATH/TO/DATASET /PATH/TO/PRETRAINED_CKPT
  183. ```
  184. 上述shell脚本将在后台进行分布式训练。可以通过文件`train[X]/output/202x-xx-xx_time_xx_xx_xx/`查看结果日志和模型检查点。在ImageNet数据集上训练DenseNet-121的损失值的实现如下:
  185. ```log
  186. 2020-08-22 16:58:54,556:INFO:epoch[0], iter[5003], loss:3.857, mean_fps:0.00 imgs/sec
  187. 2020-08-22 17:02:19,188:INFO:epoch[1], iter[10007], loss:3.18, mean_fps:6260.18 imgs/sec
  188. 2020-08-22 17:05:42,490:INFO:epoch[2], iter[15011], loss:2.621, mean_fps:6301.11 imgs/sec
  189. 2020-08-22 17:09:05,686:INFO:epoch[3], iter[20015], loss:3.113, mean_fps:6304.37 imgs/sec
  190. 2020-08-22 17:12:28,925:INFO:epoch[4], iter[25019], loss:3.29, mean_fps:6303.07 imgs/sec
  191. 2020-08-22 17:15:52,167:INFO:epoch[5], iter[30023], loss:2.865, mean_fps:6302.98 imgs/sec
  192. ...
  193. ...
  194. ```
  195. - GPU处理器环境运行
  196. ```bash
  197. cd scripts
  198. sh run_distribute_train_gpu.sh 8 0,1,2,3,4,5,6,7 [NET_NAME] [DATASET_NAME] [DATASET_PATH]
  199. ```
  200. 上述shell脚本将在后台进行分布式训练。可以通过文件`train[X]/output/202x-xx-xx_time_xx_xx_xx/`查看结果日志和模型检查点。
  201. ## 评估过程
  202. ### 评估
  203. - Ascend处理器环境
  204. 运行以下命令进行评估。
  205. ```eval
  206. python eval.py --net [NET_NAME] --dataset [DATASET_NAME] --data_dir /PATH/TO/DATASET --pretrained /PATH/TO/CHECKPOINT > eval.log 2>&1 &
  207. OR
  208. sh scripts/run_distribute_eval.sh 8 rank_table.json [NET_NAME] [DATASET_NAME] /PATH/TO/DATASET /PATH/TO/CHECKPOINT
  209. ```
  210. 上述python命令在后台运行。可以通过“output/202x-xx-xx_time_xx_xx_xx/202x_xxxx.log”文件查看结果。DenseNet-121在ImageNet的测试数据集的准确率如下:
  211. ```log
  212. 2020-08-24 09:21:50,551:INFO:after allreduce eval: top1_correct=37657, tot=49920, acc=75.43%
  213. 2020-08-24 09:21:50,551:INFO:after allreduce eval: top5_correct=46224, tot=49920, acc=92.60%
  214. ```
  215. - GPU处理器环境
  216. 运行以下命令进行评估。
  217. ```eval
  218. python eval.py --net=[NET_NAME] --dataset=[DATASET_NAME] --data_dir=[DATASET_PATH] --device_target='GPU' --pretrained=[CHECKPOINT_PATH] > eval.log 2>&1 &
  219. OR
  220. sh run_distribute_eval_gpu.sh 1 0 [NET_NAME] [DATASET_NAME] [DATASET_PATH] [CHECKPOINT_PATH]
  221. ```
  222. 上述python命令在后台运行。可以通过“eval/eval.log”文件查看结果。DenseNet-121在ImageNet的测试数据集的准确率如下:
  223. ```log
  224. 2021-02-04 14:20:50,551:INFO:after allreduce eval: top1_correct=37637, tot=49984, acc=75.30%
  225. 2021-02-04 14:20:50,551:INFO:after allreduce eval: top5_correct=46370, tot=49984, acc=92.77%
  226. ```
  227. DenseNet-100在Cifar-10的测试数据集的准确率如下:
  228. ```log
  229. 2021-03-12 18:04:07,893:INFO:after allreduce eval: top1_correct=9536, tot=9984, acc=95.51%
  230. ```
  231. - CPU处理器环境
  232. 运行以下命令进行评估。
  233. ```eval
  234. python eval.py --net=[NET_NAME] --dataset=[DATASET_NAME] --data_dir=[DATASET_PATH] --device_target='CPU' --pretrained=[CHECKPOINT_PATH] > eval.log 2>&1 &
  235. ```
  236. 上述python命令在后台运行。可以通过“eval/eval.log”文件查看结果。DenseNet-100在Cifar-10的测试数据集的准确率如下:
  237. ```log
  238. 2021-03-18 09:06:43,247:INFO:after allreduce eval: top1_correct=9492, tot=9984, acc=95.07%
  239. ```
  240. # 模型描述
  241. ## 性能
  242. ### DenseNet121
  243. ### 训练准确率结果
  244. | 参数 | Ascend | GPU |
  245. | ------------------- | -------------------------- | -------------------------- |
  246. | 模型版本 | DenseNet-121 | DenseNet-121 |
  247. | 资源 | Ascend 910 | Tesla V100-PCIE |
  248. | 上传日期 | 2020/9/15 | 2021/2/4 |
  249. | MindSpore版本 | 1.0.0 | 1.1.1 |
  250. | 数据集 | ImageNet | ImageNet |
  251. | 轮次 | 120 | 120 |
  252. | 输出 | 概率 | 概率 |
  253. | 训练性能 | Top1:75.13%;Top5:92.57% | Top1:75.30%; Top5:92.77% |
  254. ### 训练性能结果
  255. | 参数 | Ascend | GPU |
  256. | ------------------- | -------------------------------- | -------------------------------- |
  257. | 模型版本 | DenseNet-121 | DenseNet-121 |
  258. | 资源 | Ascend 910 | Tesla V100-PCIE |
  259. | 上传日期 | 2020/9/15 | 2021/2/4 |
  260. | MindSpore版本 | 1.0.0 | 1.1.1 |
  261. | 数据集 | ImageNet | ImageNet |
  262. | batch_size | 32 | 32 |
  263. | 输出 | 概率 | 概率 |
  264. | 速度 | 单卡:760 img/s;8卡:6000 img/s | 单卡:161 img/s;8卡:1288 img/s |
  265. ### DenseNet100
  266. ### 训练结果
  267. | 参数 | GPU |
  268. | ------------------- | -------------------------------- |
  269. | 模型版本 | DenseNet-100 |
  270. | 资源 | Tesla V100-PCIE |
  271. | 上传日期 | 2021/03/18 |
  272. | MindSpore版本 | 1.2.0 |
  273. | 数据集 | Cifar-10 |
  274. | 轮次 | 300 |
  275. | batch_size | 64 |
  276. | 输出 | 概率 |
  277. | 训练性能 | Top1:95.28% |
  278. | 速度 | 单卡:600.07 img/sec |
  279. # 随机情况说明
  280. dataset.py中设置了“create_dataset”函数内的种子,同时还使用了train.py中的随机种子。
  281. # ModelZoo主页
  282. 请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。