提交 d64000e5 编写于 作者: littletomatodonkey's avatar littletomatodonkey

update quick start

上级 5be6e5cd
...@@ -40,7 +40,7 @@ Mixup: [False, True] ...@@ -40,7 +40,7 @@ Mixup: [False, True]
- 精度与搜索次数对比: - 精度与搜索次数对比:
| 数据集 | 固定参数 | 网格搜索 | 网格搜索次数 | 贝叶斯搜索 | 贝叶斯搜索次数| | 数据集 | 固定参数 | 网格搜索 | 网格搜索次数 | 贝叶斯搜索 | 贝叶斯搜索次数|
| ------------------ | -------- | -------- | -------- | -------- | ---------- | | ------------------ | -------- | -------- | -------- | -------- | ---------- |
| Oxford-IIIT-Pets | 93.64% | 94.55% | 196 | 94.04% | 20 | | Oxford-IIIT-Pets | 93.64% | 94.55% | 196 | 94.04% | 20 |
| Oxford-102-Flowers | 96.08% | 97.69% | 196 | 97.49% | 20 | | Oxford-102-Flowers | 96.08% | 97.69% | 196 | 97.49% | 20 |
...@@ -79,13 +79,8 @@ Mixup: [False, True] ...@@ -79,13 +79,8 @@ Mixup: [False, True]
- 通过上述的实验验证了当使用一组固定参数时,相比于ImageNet预训练模型,使用大规模分类模型作为预训练模型在大多数情况下能够提升模型在新的数据集上得效果,通过参数搜索可以进一步提升精度。 - 通过上述的实验验证了当使用一组固定参数时,相比于ImageNet预训练模型,使用大规模分类模型作为预训练模型在大多数情况下能够提升模型在新的数据集上得效果,通过参数搜索可以进一步提升精度。
## 三、图像分类迁移学习实战
* 该部分内容正在持续更新中。
## 参考文献 ## 参考文献
[1] Kornblith, Simon, Jonathon Shlens, and Quoc V. Le. "Do better imagenet models transfer better?." *Proceedings of the IEEE conference on computer vision and pattern recognition*. 2019. [1] Kornblith, Simon, Jonathon Shlens, and Quoc V. Le. "Do better imagenet models transfer better?." *Proceedings of the IEEE conference on computer vision and pattern recognition*. 2019.
[2] Kolesnikov, Alexander, et al. "Large Scale Learning of General Visual Representations for Transfer." *arXiv preprint arXiv:1912.11370* (2019). [2] Kolesnikov, Alexander, et al. "Large Scale Learning of General Visual Representations for Transfer." *arXiv preprint arXiv:1912.11370* (2019).
\ No newline at end of file
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
## 1.简介 ## 1.简介
本文档介绍ImageNet1k和flowers102数据准备过程。 本文档介绍ImageNet1k和flowers102数据准备过程。
以及PaddleClas提供了丰富的[预训练模型](../models/models_intro.md)
## 2.数据集准备 ## 2.数据集准备
...@@ -46,9 +45,13 @@ PaddleClas/dataset/imagenet/ ...@@ -46,9 +45,13 @@ PaddleClas/dataset/imagenet/
``` ```
### Flowers102 ### Flowers102
[VGG官方网站](https://www.robots.ox.ac.uk/~vgg/data/flowers/102/)下载后的数据,解压后包括 [VGG官方网站](https://www.robots.ox.ac.uk/~vgg/data/flowers/102/)下载后的数据,解压后包括
```shell
jpg/ jpg/
setid.mat setid.mat
imagelabels.mat imagelabels.mat
```
将以上文件放置在PaddleClas/dataset/flowers102/下 将以上文件放置在PaddleClas/dataset/flowers102/下
通过运行generate_flowers102_list.py生成train_list.txt和val_list.txt 通过运行generate_flowers102_list.py生成train_list.txt和val_list.txt
...@@ -69,16 +72,3 @@ PaddleClas/dataset/flowers102/ ...@@ -69,16 +72,3 @@ PaddleClas/dataset/flowers102/
|_ train_list.txt |_ train_list.txt
|_ val_list.txt |_ val_list.txt
``` ```
## 3.下载预训练模型
通过tools/download.py下载所需要的预训练模型。
```bash
python tools/download.py -a ResNet50_vd -p ./pretrained -d True
```
参数说明:
+ `architecture`(简写 a):模型结构
+ `path`(简写 p):下载路径
+ `decompress` (简写 d):是否解压
...@@ -6,6 +6,6 @@ ...@@ -6,6 +6,6 @@
install.md install.md
quick_start.md quick_start.md
getting_started.md
config.md
data.md data.md
getting_started.md
config.md
\ No newline at end of file
# 30min玩转PaddleClas # 30min玩转PaddleClas
请事先参考[安装指南](install.md)配置运行环境 请事先参考[安装指南](install.md)配置运行环境和克隆PaddleClas代码。
## 一、代码和数据准备 ## 一、数据和模型准备
* 克隆代码到本地并进入PaddleClas目录。 * 进入PaddleClas目录。
``` ```
git clone https://github.com/PaddlePaddle/PaddleClas.git cd path_to_PaddleClas
cd PaddleClas
``` ```
* 进入`dataset/flowers102`目录,下载并解压flowers102数据集. * 进入`dataset/flowers102`目录,下载并解压flowers102数据集.
...@@ -18,11 +17,11 @@ cd PaddleClas ...@@ -18,11 +17,11 @@ cd PaddleClas
cd dataset/flowers102 cd dataset/flowers102
wget https://www.robots.ox.ac.uk/~vgg/data/flowers/102/102flowers.tgz wget https://www.robots.ox.ac.uk/~vgg/data/flowers/102/102flowers.tgz
wget https://www.robots.ox.ac.uk/~vgg/data/flowers/102/imagelabels.mat wget https://www.robots.ox.ac.uk/~vgg/data/flowers/102/imagelabels.mat
wget https://www.robots.ox.ac.uk/~vgg/data/flowers/102/setid.ma wget https://www.robots.ox.ac.uk/~vgg/data/flowers/102/setid.mat
tar -xf 102flowers.tgz tar -xf 102flowers.tgz
``` ```
* 制作train/val/test list * 制作train/val/test标签文件
```shell ```shell
python generate_flowers102_list.py jpg train > train_list.txt python generate_flowers102_list.py jpg train > train_list.txt
...@@ -33,7 +32,6 @@ cat train_list.txt test_list.txt > train_test.txt ...@@ -33,7 +32,6 @@ cat train_list.txt test_list.txt > train_test.txt
**注意**:这里将train_list.txt和test_list.txt合并成train_test.txt,是为了之后在进行知识蒸馏时,使用更多的数据提升无标签知识蒸馏任务的效果。 **注意**:这里将train_list.txt和test_list.txt合并成train_test.txt,是为了之后在进行知识蒸馏时,使用更多的数据提升无标签知识蒸馏任务的效果。
* 返回`PaddleClas`根目录 * 返回`PaddleClas`根目录
``` ```
...@@ -48,13 +46,29 @@ cd ../../ ...@@ -48,13 +46,29 @@ cd ../../
export PYTHONPATH=./:$PYTHONPATH export PYTHONPATH=./:$PYTHONPATH
``` ```
### 下载预训练模型
通过tools/download.py下载所需要的预训练模型。
```bash
python tools/download.py -a ResNet50_vd -p ./pretrained -d True
python tools/download.py -a ResNet50_vd_ssld -p ./pretrained -d True
python tools/download.py -a MobileNetV3_large_x1_0 -p ./pretrained -d True
```
参数说明:
+ `architecture`(简写 a):模型结构
+ `path`(简写 p):下载路径
+ `decompress` (简写 d):是否解压
### 2.2 环境说明 ### 2.2 环境说明
* 为了保证对比的公平性,下面所有的训练过程均在`单卡V100`机器上实现 * 下面所有的训练过程均在`单卡V100`机器上运行
## 三、模型训练 ## 三、模型训练
* 本章节首先展示基于ResNet50_vd模型结构,在不加载预训练模型、加载精度为79.12\%的预训练模型以及精度为82.39\%的预训练模型的训练效果,同时给出了基于MobileNetV3模型结构的训练效果。此外,为了更方便地体验数据增广以及知识蒸馏的训练过程,本章节也提供了对应的训练命令。
### 3.1 零基础训练:不加载预训练模型的训练 ### 3.1 零基础训练:不加载预训练模型的训练
...@@ -64,44 +78,35 @@ export PYTHONPATH=./:$PYTHONPATH ...@@ -64,44 +78,35 @@ export PYTHONPATH=./:$PYTHONPATH
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch   python -m paddle.distributed.launch  
    --selected_gpus="0"       --selected_gpus="0"  
    --log_dir=log_train  
    tools/train.py       tools/train.py  
        -c ./configs/quick_start/ResNet50_vd.yaml         -c ./configs/quick_start/ResNet50_vd.yaml
``` ```
最终`Loss`曲线如下所示。 `Top1 Acc`曲线如下所示,最高准确率为0.2735。
![](../../images/quick_start/r50_vd_loss.png)
`Top1 Acc`曲线如下所示。
![](../../images/quick_start/r50_vd_acc.png) ![](../../images/quick_start/r50_vd_acc.png)
### 3.2 基于精度为79.12\%的ImageNet预训练模型微调 ### 3.2 基于精度为79.12\%的ResNet50_vd预训练模型微调
* 基于ImageNet1k分类预训练模型进行微调,训练脚本如下所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch   python -m paddle.distributed.launch  
    --selected_gpus="0"       --selected_gpus="0"  
    --log_dir=log_train  
    tools/train.py       tools/train.py  
        -c ./configs/quick_start/ResNet50_vd.yaml         -c ./configs/quick_start/ResNet50_vd_finetune.yaml
``` ```
最终`Loss`曲线如下所示。 `Top1 Acc`曲线如下所示,最高准确率为0.9402,加载预训练模型之后,flowers102数据集精度大幅提升,绝对精度涨幅超过65\%
![](../../images/quick_start/r50_vd_pretrained_loss.png)
`Top1 Acc`曲线如下所示。
![](../../images/quick_start/r50_vd_pretrained_acc.png) ![](../../images/quick_start/r50_vd_pretrained_acc.png)
### 3.3 基于精度82.39\%的ImageNet预训练模型微调 ### 3.3 基于精度82.39\%的ResNet50_vd预训练模型微调
需要注意的是,在使用通过知识蒸馏得到的预训练模型进行微调时,我们推荐使用相对较小的网络中间层学习率。 需要注意的是,在使用通过知识蒸馏得到的预训练模型进行微调时,我们推荐使用相对较小的网络中间层学习率。
...@@ -115,20 +120,51 @@ ARCHITECTURE: ...@@ -115,20 +120,51 @@ ARCHITECTURE:
pretrained_model: "./pretrained/ResNet50_vd_ssld_pretrained" pretrained_model: "./pretrained/ResNet50_vd_ssld_pretrained"
``` ```
训练脚本如下。
最终的训练脚本所示。
```shell ```shell
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch   python -m paddle.distributed.launch  
    --selected_gpus="0"       --selected_gpus="0"  
    --log_dir=log_train  
    tools/train.py       tools/train.py  
        -c ./configs/quick_start/ResNet50_vd_ssld_finetune.yaml         -c ./configs/quick_start/ResNet50_vd_ssld_finetune.yaml
``` ```
### 3.4 使用ResNet50_vd蒸馏MobileNetV3 最终flowers102验证集上精度指标为0.95,相对于79.12\%预训练模型的微调结构,新数据集指标可以再次提升0.9\%
### 3.4 尝试更多的模型结构-MobileNetV3
训练脚本如下所示。
```shell
export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch  
    --selected_gpus="0"  
    tools/train.py  
        -c ./configs/quick_start/MobileNetV3_large_x1_0_finetune.yaml
```
最终flowers102验证集上的精度为0.90,比加载了预训练模型的ResNet50_vd的精度差了5\%。不同模型结构的网络在相同数据集上的性能表现不同,需要根据预测耗时以及存储的需求选择合适的模型。
* 使用flowers102数据集进行模型蒸馏,为了进一步提提升模型的精度,使用test_list.txt充当无标签数据,在这里有三点需要注意: ### 3.5 数据增广的尝试-RandomErasing
训练数据量较小时,使用数据增广可以进一步提升模型精度,基于`3.3节`中的训练方法,结合RandomErasing的数据增广方式进行训练,具体的训练脚本如下所示。
```shell
export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch  
    --selected_gpus="0"  
    tools/train.py  
        -c ./configs/quick_start/ResNet50_vd_ssld_random_erasing_finetune.yaml
```
最终flowers102验证集上的精度为0.9627,使用数据增广可以使得模型精度再次提升1.27\%
### 3.6 知识蒸馏小试牛刀
* 使用flowers102数据集进行模型蒸馏,为了进一步提提升模型的精度,使用test_list.txt充当无标签数据,在这里有几点需要注意:
* `test_list.txt``val_list.txt`的样本没有重复。 * `test_list.txt``val_list.txt`的样本没有重复。
* 即使引入了有标签的test_list.txt中的测试集图像,但是代码中没有使用标签信息,因此仍然可以视为无标签的模型蒸馏。 * 即使引入了有标签的test_list.txt中的测试集图像,但是代码中没有使用标签信息,因此仍然可以视为无标签的模型蒸馏。
* 蒸馏过程中,教师模型使用的预训练模型为flowers102数据集上的训练结果,学生模型使用的是ImageNet1k数据集上精度为75.32\%的MobileNetV3_large_x1_0预训练模型。 * 蒸馏过程中,教师模型使用的预训练模型为flowers102数据集上的训练结果,学生模型使用的是ImageNet1k数据集上精度为75.32\%的MobileNetV3_large_x1_0预训练模型。
...@@ -141,7 +177,6 @@ python -m paddle.distributed.launch \   ...@@ -141,7 +177,6 @@ python -m paddle.distributed.launch \  
cp -r output/ResNet50_vd/19/ ./pretrained/flowers102_R50_vd_final/ cp -r output/ResNet50_vd/19/ ./pretrained/flowers102_R50_vd_final/
``` ```
配置文件中数据数量、模型结构、预训练地址以及训练的数据配置如下: 配置文件中数据数量、模型结构、预训练地址以及训练的数据配置如下:
```yaml ```yaml
...@@ -161,40 +196,10 @@ TRAIN: ...@@ -161,40 +196,10 @@ TRAIN:
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch   python -m paddle.distributed.launch  
    --selected_gpus="0"       --selected_gpus="0"  
    --log_dir=log_train  
    tools/train.py       tools/train.py  
        -c ./configs/quick_start/R50_vd_distill_MV3_large_x1_0.yaml         -c ./configs/quick_start/R50_vd_distill_MV3_large_x1_0.yaml
``` ```
### 3.5 其他模型
* 如果希望尝试更多的模型结构,可以很方便地修改模型名称,下面给出了使用MobileNetV3模型训练的命令。
```shell
export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch  
    --selected_gpus="0"  
    --log_dir=log_train  
    tools/train.py  
        -c ./configs/quick_start/MobileNetV3_large_x1_0_finetune.yaml
```
* 如果希望尝试增广方式,可以通过以下命令提供体验RandomErasing数据增广的训练效果。
```shell
export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch  
    --selected_gpus="0"  
    --log_dir=log_train  
    tools/train.py  
        -c ./configs/quick_start/ResNet50_vd_ssld_random_erasing_finetune.yaml
```
### 3.6 精度一览 ### 3.6 精度一览
* 下表给出了不同训练yaml文件对应的精度。 * 下表给出了不同训练yaml文件对应的精度。
...@@ -209,20 +214,11 @@ python -m paddle.distributed.launch \   ...@@ -209,20 +214,11 @@ python -m paddle.distributed.launch \  
| R50_vd_distill_MV3_large_x1_0.yaml | 0.9647 | | R50_vd_distill_MV3_large_x1_0.yaml | 0.9647 |
下图给出了不同配置文件的`Loss``Top1 Acc`的精度对比。 下图给出了不同配置文件在迭代过程中的`Top1 Acc`的精度曲线变化图。
![](../../images/quick_start/all_loss.png)
`Top1 Acc`曲线如下所示。
![](../../images/quick_start/all_acc.png) ![](../../images/quick_start/all_acc.png)
### 3.7 总结 ### 3.7 总结
* 对于新数据集,更推荐通过加载预训练模型进行微调的方式进行训练,以在新的数据集上获得更高的精度,减少收敛时间。 * PaddleClas提供了十分丰富的模型库以及详细的高阶使用、预测部署文档,更多的内容可以参考[PaddleClas文档](https://paddleclas.readthedocs.io/zh_CN/latest/index.html)
* 预训练模型
* 不同模型结构的网络在相同数据集上的性能表现不同,需要根据预测耗时以及存储的需求选择合适的模型。
* 数据增广在小数据集的训练中可以进一步提升模型精度。PaddleClas中也提供了8种数据增广方式,您也开业
* 无标签数据的知识蒸馏可以大幅提升学生模型的精度,甚至超越教师模型。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册