提交 7cb0d27a 编写于 作者: S sibo2rr

add menu to quick_start_classification_professional.md

上级 23a67b94
...@@ -2,8 +2,32 @@ ...@@ -2,8 +2,32 @@
此处提供了专业用户在linux操作系统上使用PaddleClas的快速上手教程,主要内容基于CIFAR-100数据集,快速体验不同模型的训练、加载不同预训练模型、SSLD知识蒸馏方案和数据增广的效果。请事先参考[安装指南](../installation/install_paddleclas.md)配置运行环境和克隆PaddleClas代码。 此处提供了专业用户在linux操作系统上使用PaddleClas的快速上手教程,主要内容基于CIFAR-100数据集,快速体验不同模型的训练、加载不同预训练模型、SSLD知识蒸馏方案和数据增广的效果。请事先参考[安装指南](../installation/install_paddleclas.md)配置运行环境和克隆PaddleClas代码。
------
## 一、数据和模型准备 ## 目录
- [1. 数据和模型准备](#1)
- [1.1 数据准备](#1.1)
- [1.1.1 准备CIFAR100](#1.1.1)
- [2. 模型训练](#2)
- [2.1 单标签训练](#2.1)
- [2.1.1 零基础训练:不加载预训练模型的训练](#2.1.1)
- [2.1.2 迁移学习](#2.1.2)
- [3. 数据增广](#3)
- [3.1 数据增广的尝试-Mixup](#3.1)
- [4. 知识蒸馏](#4)
- [5. 模型评估与推理](#5)
- [5.1 单标签分类模型评估与推理](#5.1)
- [5.1.1 单标签分类模型评估](#5.1.1)
- [5.1.2 单标签分类模型预测](#5.1.2)
- [5.1.3 单标签分类使用inference模型进行模型推理](#5.1.3)
<a name="1"></a>
## 1. 数据和模型准备
<a name="1.1"></a>
### 1.1 数据准备 ### 1.1 数据准备
...@@ -14,6 +38,8 @@ ...@@ -14,6 +38,8 @@
cd path_to_PaddleClas cd path_to_PaddleClas
``` ```
<a name="1.1.1"></a>
#### 1.1.1 准备CIFAR100 #### 1.1.1 准备CIFAR100
* 进入`dataset/`目录,下载并解压CIFAR100数据集。 * 进入`dataset/`目录,下载并解压CIFAR100数据集。
...@@ -25,14 +51,19 @@ tar -xf CIFAR100.tar ...@@ -25,14 +51,19 @@ tar -xf CIFAR100.tar
cd ../ cd ../
``` ```
<a name="2"></a>
## 2. 模型训练
## 二、模型训练 <a name="2.1"></a>
### 2.1 单标签训练 ### 2.1 单标签训练
<a name="2.1.2"></a>
#### 2.1.1 零基础训练:不加载预训练模型的训练 #### 2.1.1 零基础训练:不加载预训练模型的训练
* 基于ResNet50_vd模型,训练脚本如下所示。 * 基于 ResNet50_vd 模型,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -43,13 +74,14 @@ python3 -m paddle.distributed.launch \ ...@@ -43,13 +74,14 @@ python3 -m paddle.distributed.launch \
-o Global.output_dir="output_CIFAR" -o Global.output_dir="output_CIFAR"
``` ```
验证集的最高准确率为 0.415 左右。
验证集的最高准确率为0.415左右。 <a name="2.1.2"></a>
#### 2.1.2 迁移学习 #### 2.1.2 迁移学习
* 基于ImageNet1k分类预训练模型ResNet50_vd_pretrained(准确率79.12\%)进行微调,训练脚本如下所示。 * 基于 ImageNet1k 分类预训练模型 ResNet50_vd_pretrained(准确率 79.12%)进行微调,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -61,9 +93,9 @@ python3 -m paddle.distributed.launch \ ...@@ -61,9 +93,9 @@ python3 -m paddle.distributed.launch \
-o Arch.pretrained=True -o Arch.pretrained=True
``` ```
验证集最高准确率为0.718左右,加载预训练模型之后,CIFAR100数据集精度大幅提升,绝对精度涨幅30\% 验证集最高准确率为 0.718 左右,加载预训练模型之后,CIFAR100 数据集精度大幅提升,绝对精度涨幅 30%。
* 基于ImageNet1k分类预训练模型ResNet50_vd_ssld_pretrained(准确率82.39\%)进行微调,训练脚本如下所示。 * 基于 ImageNet1k 分类预训练模型 ResNet50_vd_ssld_pretrained (准确率82.39%)进行微调,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -76,9 +108,9 @@ python3 -m paddle.distributed.launch \ ...@@ -76,9 +108,9 @@ python3 -m paddle.distributed.launch \
-o Arch.use_ssld=True -o Arch.use_ssld=True
``` ```
最终CIFAR100验证集上精度指标为0.73,相对于79.12\%预训练模型的微调结构,新数据集指标可以再次提升1.2\% 最终CIFAR100验证集上精度指标为 0.73,相对于 79.12% 预训练模型的微调结构,新数据集指标可以再次提升1.2%。
* 替换backbone为MobileNetV3_large_x1_0进行微调,训练脚本如下所示。 * 替换 backbone 为 MobileNetV3_large_x1_0 进行微调,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -90,16 +122,20 @@ python3 -m paddle.distributed.launch \ ...@@ -90,16 +122,20 @@ python3 -m paddle.distributed.launch \
-o Arch.pretrained=True -o Arch.pretrained=True
``` ```
验证集最高准确率为0.601左右, 较ResNet50_vd低近12%。 验证集最高准确率为 0.601 左右, 较 ResNet50_vd 低近 12%。
<a name="3"></a>
## 三、数据增广 ## 3. 数据增广
PaddleClas包含了很多数据增广的方法,如Mixup、Cutout、RandomErasing等,具体的方法可以参考[数据增广的章节](../algorithm_introduction/DataAugmentation.md) PaddleClas包含了很多数据增广的方法,如 Mixup、Cutout、RandomErasing 等,具体的方法可以参考[数据增广的章节](../algorithm_introduction/DataAugmentation.md)
### 数据增广的尝试-Mixup <a name="3.1"></a>
基于`3.3节`中的训练方法,结合Mixup的数据增广方式进行训练,具体的训练脚本如下所示。 ### 3.1 数据增广的尝试-Mixup
基于[数据增广的章节](../algorithm_introduction/DataAugmentation.md) `3.3节` 中的训练方法,结合 Mixup 的数据增广方式进行训练,具体的训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
...@@ -111,28 +147,29 @@ python3 -m paddle.distributed.launch \ ...@@ -111,28 +147,29 @@ python3 -m paddle.distributed.launch \
``` ```
最终CIFAR100验证集上的精度为0.73,使用数据增广可以使得模型精度再次提升约1.2\% 最终CIFAR100验证集上的精度为 0.73,使用数据增广可以使得模型精度再次提升约 1.2%。
* **注意** * **注意**
* 其他数据增广的配置文件可以参考`ppcls/configs/DataAugment`中的配置文件。 * 其他数据增广的配置文件可以参考 `ppcls/configs/DataAugment` 中的配置文件。
* 训练 CIFAR100 的迭代轮数较少,因此进行训练时,验证集的精度指标可能会有 1% 左右的波动。
* 训练CIFAR100的迭代轮数较少,因此进行训练时,验证集的精度指标可能会有1\%左右的波动。 <a name="4"></a>
## 四、知识蒸馏 ## 4. 知识蒸馏
PaddleClas包含了自研的SSLD知识蒸馏方案,具体的内容可以参考[知识蒸馏章节](../algorithm_introduction/knowledge_distillation.md), 本小节将尝试使用知识蒸馏技术对MobileNetV3_large_x1_0模型进行训练,使用`2.1.2小节`训练得到的ResNet50_vd模型作为蒸馏所用的教师模型,首先将`2.1.2小节`训练得到的ResNet50_vd模型保存到指定目录,脚本如下。 PaddleClas 包含了自研的 SSLD 知识蒸馏方案,具体的内容可以参考[知识蒸馏章节](../algorithm_introduction/knowledge_distillation.md), 本小节将尝试使用知识蒸馏技术对 MobileNetV3_large_x1_0 模型进行训练,使用 `2.1.2小节` 训练得到的 ResNet50_vd 模型作为蒸馏所用的教师模型,首先将 `2.1.2小节` 训练得到的 ResNet50_vd 模型保存到指定目录,脚本如下。
```shell ```shell
mkdir pretrained mkdir pretrained
cp -r output_CIFAR/ResNet50_vd/best_model.pdparams ./pretrained/ cp -r output_CIFAR/ResNet50_vd/best_model.pdparams ./pretrained/
``` ```
配置文件中模型名字、教师模型哈学生模型的配置、预训练地址配置以及freeze_params配置如下,其中freeze_params_list中的两个值分别代表教师模型和学生模型是否冻结参数训练。 配置文件中模型名字、教师模型和学生模型的配置、预训练地址配置以及 freeze_params 配置如下,其中 `freeze_params_list` 中的两个值分别代表教师模型和学生模型是否冻结参数训练。
```yaml ```yaml
Arch: Arch:
...@@ -152,7 +189,8 @@ Arch: ...@@ -152,7 +189,8 @@ Arch:
pretrained: True pretrained: True
``` ```
Loss配置如下,其中训练Loss是学生模型的输出和教师模型的输出的交叉熵、验证Loss是学生模型的输出和真实标签的交叉熵。 Loss 配置如下,其中训练 Loss 是学生模型的输出和教师模型的输出的交叉熵、验证 Loss 是学生模型的输出和真实标签的交叉熵。
```yaml ```yaml
Loss: Loss:
Train: Train:
...@@ -178,19 +216,23 @@ python3 -m paddle.distributed.launch \ ...@@ -178,19 +216,23 @@ python3 -m paddle.distributed.launch \
``` ```
最终CIFAR100验证集上的精度为64.4\%,使用教师模型进行知识蒸馏,MobileNetV3的精度涨幅4.3\% 最终CIFAR100验证集上的精度为 64.4%,使用教师模型进行知识蒸馏,MobileNetV3 的精度涨幅 4.3%。
* **注意** * **注意**
* 蒸馏过程中,教师模型使用的预训练模型为CIFAR100数据集上的训练结果,学生模型使用的是ImageNet1k数据集上精度为75.32\%的MobileNetV3_large_x1_0预训练模型。 * 蒸馏过程中,教师模型使用的预训练模型为 CIFAR100 数据集上的训练结果,学生模型使用的是 ImageNet1k 数据集上精度为 75.32% 的 MobileNetV3_large_x1_0 预训练模型。
* 该蒸馏过程无须使用真实标签,所以可以使用更多的无标签数据,在使用过程中,可以将无标签数据生成假的 `train_list.txt` ,然后与真实的 `train_list.txt` 进行合并, 用户可以根据自己的数据自行体验。
* 该蒸馏过程无须使用真实标签,所以可以使用更多的无标签数据,在使用过程中,可以将无标签数据生成假的train_list.txt,然后与真实的train_list.txt进行合并, 用户可以根据自己的数据自行体验。 <a name="5"></a>
## 5. 模型评估与推理
## 五、模型评估与推理 <a name="5.1"></a>
### 5.1 单标签分类模型评估与推理 ### 5.1 单标签分类模型评估与推理
<a name="5.1.1"></a>
#### 5.1.1 单标签分类模型评估。 #### 5.1.1 单标签分类模型评估。
训练好模型之后,可以通过以下命令实现对模型精度的评估。 训练好模型之后,可以通过以下命令实现对模型精度的评估。
...@@ -201,6 +243,8 @@ python3 tools/eval.py \ ...@@ -201,6 +243,8 @@ python3 tools/eval.py \
-o Global.pretrained_model="output_CIFAR/ResNet50_vd/best_model" -o Global.pretrained_model="output_CIFAR/ResNet50_vd/best_model"
``` ```
<a name="5.1.2"></a>
#### 5.1.2 单标签分类模型预测 #### 5.1.2 单标签分类模型预测
模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测: 模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 `tools/infer.py` 中提供了完整的示例,只需执行下述命令即可完成模型预测:
...@@ -212,10 +256,11 @@ python3 tools/infer.py \ ...@@ -212,10 +256,11 @@ python3 tools/infer.py \
-o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model -o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model
``` ```
<a name="5.1.3"></a>
#### 5.1.3 单标签分类使用inference模型进行模型推理 #### 5.1.3 单标签分类使用inference模型进行模型推理
通过导出inference模型,PaddlePaddle支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理: 通过导出 inference 模型,PaddlePaddle 支持使用预测引擎进行预测推理。接下来介绍如何用预测引擎进行推理:
首先,对训练好的模型进行转换: 首先,对训练好的模型进行转换:
```bash ```bash
...@@ -224,7 +269,7 @@ python3 tools/export_model.py \ ...@@ -224,7 +269,7 @@ python3 tools/export_model.py \
-o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model -o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model
``` ```
* 默认会在`inference`文件夹下生成`inference.pdiparams``inference.pdmodel``inference.pdiparams.info`文件。 * 默认会在 `inference` 文件夹下生成 `inference.pdiparams``inference.pdmodel``inference.pdiparams.info` 文件。
使用预测引擎进行推理: 使用预测引擎进行推理:
...@@ -233,7 +278,8 @@ python3 tools/export_model.py \ ...@@ -233,7 +278,8 @@ python3 tools/export_model.py \
```bash ```bash
cd deploy cd deploy
``` ```
更改inference_cls.yaml文件,由于训练CIFAR100采用的分辨率是32x32,所以需要改变相关的分辨率,最终配置文件中的图像预处理如下:
更改 `inference_cls.yaml` 文件,由于训练 CIFAR100 采用的分辨率是 32x32,所以需要改变相关的分辨率,最终配置文件中的图像预处理如下:
```yaml ```yaml
PreProcess: PreProcess:
...@@ -250,7 +296,7 @@ PreProcess: ...@@ -250,7 +296,7 @@ PreProcess:
- ToCHWImage: - ToCHWImage:
``` ```
执行命令进行预测,由于默认class_id_map_file是ImageNet数据集的映射文件,所以此处需要置None。 执行命令进行预测,由于默认 `class_id_map_file` 是 ImageNet 数据集的映射文件,所以此处需要置 None。
```bash ```bash
python3 python/predict_cls.py \ python3 python/predict_cls.py \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册