From 9b62afdfad490bde2032d05fe00341017be74c9b Mon Sep 17 00:00:00 2001 From: wangshipeng01 Date: Sun, 19 Apr 2020 08:10:23 +0000 Subject: [PATCH] fix --- configs/flower.yaml | 74 ++++++++++++++++ docs/zh_CN/tutorials/data.md | 23 +++-- docs/zh_CN/tutorials/finetune.md | 110 ------------------------ docs/zh_CN/tutorials/getting_started.md | 34 +++++++- 4 files changed, 117 insertions(+), 124 deletions(-) create mode 100644 configs/flower.yaml delete mode 100644 docs/zh_CN/tutorials/finetune.md diff --git a/configs/flower.yaml b/configs/flower.yaml new file mode 100644 index 00000000..8375adca --- /dev/null +++ b/configs/flower.yaml @@ -0,0 +1,74 @@ +mode: 'train' +architecture: 'ResNet50_vd' +pretrained_model: +model_save_dir: "./output/" +classes_num: 102 +total_images: 1020 +save_interval: 10 +validate: True +valid_interval: 1 +epochs: 40 +topk: 5 +image_shape: [3, 224, 224] + +ls_epsilon: 0.1 + +LEARNING_RATE: + function: 'Cosine' + params: + lr: 0.00375 + +OPTIMIZER: + function: 'Momentum' + params: + momentum: 0.9 + regularizer: + function: 'L2' + factor: 0.000001 + +TRAIN: + batch_size: 32 + num_workers: 1 + file_list: "./dataset/flower102/train_list.txt" + data_dir: "./dataset/flower102" + shuffle_seed: 0 + transforms: + - DecodeImage: + to_rgb: True + to_np: False + channel_first: False + - RandCropImage: + size: 224 + - RandFlipImage: + flip_code: 1 + - NormalizeImage: + scale: 1./255. + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + #mix: + # - MixupOperator: + # alpha: 0.2 + +VALID: + batch_size: 64 + num_workers: 1 + file_list: "./dataset/flower102/val_list.txt" + data_dir: "./dataset/flower102/" + shuffle_seed: 0 + transforms: + - DecodeImage: + to_rgb: True + to_np: False + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 224 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: diff --git a/docs/zh_CN/tutorials/data.md b/docs/zh_CN/tutorials/data.md index 1fee05a1..6f4961f8 100644 --- a/docs/zh_CN/tutorials/data.md +++ b/docs/zh_CN/tutorials/data.md @@ -4,7 +4,7 @@ ## 1.简介 本文档介绍ImageNet1k和Flower102数据准备过程。 -PaddleClas提供了丰富的预训练模型,支持的模型列表请参考[模型库](../models/models_intro.md) +以及PaddleClas提供了丰富的[预训练模型](../models/models_intro.md) ## 2.数据集准备 @@ -14,8 +14,15 @@ PaddleClas提供了丰富的预训练模型,支持的模型列表请参考[模 [ImageNet1k](http://www.image-net.org/challenges/LSVRC/2012/)|1.2M| 50k | 1000 | 数据格式 -PaddleClas加载PaddleClas/dataset/中的数据,通过指定data_dir和file_list来进行加载 +按照如下结构组织数据,其中train_list.txt 和val_list.txt的格式形如 +``` +#path_to_image Class + +ILSVRC2012_val_00000001.JPEG 65 +... + +``` ### ImageNet1k 从官方下载数据后,按如下组织数据 @@ -38,7 +45,7 @@ PaddleClas/dataset/imagenet/ |_ val_list.txt ``` ### Flower -从VGG官方网站下载后的数据,解压后包括 +从[VGG官方网站](https://www.robots.ox.ac.uk/~vgg/data/flowers/102/)下载后的数据,解压后包括 jpg/ setid.mat imagelabels.mat @@ -63,16 +70,6 @@ PaddleClas/dataset/flower102/ |_ val_list.txt ``` -或是通过软链接将数据从实际地址链接到PaddleClas/dataset/下 - -```bash -#imagenet -ln -s actual_path/imagenet path_to_PaddleClas/dataset/imagenet - -#flower -ln -s actual_path/flower path_to_PaddleClas/dataset/flower - -``` ## 3.下载预训练模型 通过tools/download.py下载所需要的预训练模型。 diff --git a/docs/zh_CN/tutorials/finetune.md b/docs/zh_CN/tutorials/finetune.md deleted file mode 100644 index b318527e..00000000 --- a/docs/zh_CN/tutorials/finetune.md +++ /dev/null @@ -1,110 +0,0 @@ -# 模型微调 - -本文档将介绍如何使用PaddleClas进行模型微调(finetune) -模型微调使用PaddleClas提供的预训练模型,可以节省从头训练的计算资源和时间,并提高准确率。 - -> 在使用ResNet50_vd_ssld蒸馏模型对flower102数据进行模型微调,仅需要3分钟(V100 单卡)top1即可达到94.96% - - -模型微调大致包括如下四个步骤: -- 初始化预训练模型 -- 剔除FC层 -- 更新参数 -- 新的训练策略 - - -## 初始化预训练模型 - -这里我们以ResNet50_vd和ResNet50_vd_ssld预训练模型对flower102数据集进行微调 - -ResNet50_vd: 在ImageNet1k数据集上训练 top1 acc:79.1% 模型详细信息参考[模型库](https://paddleclas.readthedocs.io/zh_CN/latest/models/ResNet_and_vd.html) - -ResNet50_vd_ssld: 在ImageNet1k数据集训练的蒸馏模型 top1: 82.4% 模型详细信息参考[模型库](https://paddleclas.readthedocs.io/zh_CN/latest/models/ResNet_and_vd.html) - -flower数据集相关信息参考[数据文档](data.md) - -指定pretrained_model参数初始化预训练模型 -ResNet50_vd: - -```bash -python -m paddle.distributed.launch \ - --selected_gpus="0" \ - tools/train.py \ - -c ./configs/finetune/ResNet50_vd_finetune.yaml - -o pretrained_model= ResNet50_vd预训练模型 -``` - -ResNet50_vd_ssld: - -```bash -python -m paddle.distributed.launch \ - --selected_gpus="0" \ - tools/train.py \ - -c ./configs/finetune/ResNet50_vd_ssld_finetune.yaml - -o pretrained_model= ResNet50_vd_ssld预训练模型 -``` - - -## 剔除FC层 - -由于新的数据集类别数(Flower102:102类)和ImgaeNet1k数据(1000类)不一致,一般需要对分类网络的最后FC层进行调整,PaddleClas默认剔除所有形状不一样的层 - -```python -#excerpt from PaddleClas/ppcls/utils/save_load.py - -def load_params(exe, prog, path): - # ... - - ignore_set = set() - state = _load_state(path) - - # 剔除预训练模型和模型间形状不一致的参数 - - all_var_shape = {} - for block in prog.blocks: - for param in block.all_parameters(): - all_var_shape[param.name] = param.shape - ignore_set.update([ - name for name, shape in all_var_shape.items() - if name in state and shape != state[name].shape - ]) - - # 用于迁移学习的代码段已被省略 ... - - if len(ignore_set) > 0: - for k in ignore_set: - if k in state: - # 剔除参数 - del state[k] - fluid.io.set_program_state(prog, state) -``` -在将shape不一致的层进行剔除正确加载预训练模型后,我们要选择需要更新的参数来让优化器进行参数更新。 - -## 更新参数 - -首先,分类网络中的卷积层大致可以分为 - -- ```浅层卷积层```:用于提取基础特征 -- ```深层卷积层```:用于提取抽象特征 -- ```FC层```:进行特征组合 - -其次,在衡量数据集大小差别和数据集的相似程度后,我们一般遵循如下的规则进行参数更新: - -- 1. 新的数据集很小,在类别,具体种类上和原数据很像。由于新数据集很小,这里可能出现过拟合的问题;由于数据很像,可以认为预训练模型的深层特征仍然会起作用,只需要训练一个最终的```FC层```即可。 -- 2. 新的数据集很大,在类别,具体种类上和原数据很像。推荐训练网络中全部层的参数。 -- 3. 新的数据集很小但是和原数据不相像,可以冻结网络中初始层的参数更新```stop_gradient=True```,对较高层进行重新训练。 -- 4. 新的数据集很大但是和原数据不相像,这时候预训练模型可能不会生效,需要从头训练。 - -PaddleClas模型微调默认更新所有层参数。 - -## 新的训练策略 - -1. 学习率 -由于已经加载了预训练模型,对于从头训练的随机初始化参数来讲,模型中的参数已经具备了一定的分类能力,所以建议使用与从头训练相比更小的学习率,例如减小10倍。 -2. 类别数和总图片数调整为新数据集数据 -3. 调整训练轮数,由于不需要从头开始训练,一般相对减少模型微调的训练轮数 - -## 模型微调结果 - -在使用ResNet50_vd预训练模型对flower102数据进行模型微调后,top1 acc 达到 92.71% -在使用ResNet50_vd_ssld预训练模型对flower102数据进行模型微调后,top1 acc 达到94.96% diff --git a/docs/zh_CN/tutorials/getting_started.md b/docs/zh_CN/tutorials/getting_started.md index 0945114b..251ad2e0 100644 --- a/docs/zh_CN/tutorials/getting_started.md +++ b/docs/zh_CN/tutorials/getting_started.md @@ -56,7 +56,39 @@ epoch:0 train step:522 loss:1.6330 lr:0.100000 elapse:0.210 或是直接修改模型对应的yaml配置文件,具体配置参数参考[配置文档](config.md)。 ### 2.3 模型微调 -模型微调请参照[模型微调文档](./finetune.md) + +以ResNet50_vd和ResNet50_vd_ssld预训练模型对flower102数据集进行微调 + +ResNet50_vd: 在ImageNet1k数据集上训练 top1 acc:79.1% 模型详细信息参考[模型库](https://paddleclas.readthedocs.io/zh_CN/latest/models/ResNet_and_vd.html) + +ResNet50_vd_ssld: 在ImageNet1k数据集训练的蒸馏模型 top1: 82.4% 模型详细信息参考[模型库](https://paddleclas.readthedocs.io/zh_CN/latest/models/ResNet_and_vd.html) + +flower数据集相关信息参考[数据文档](data.md) + +指定pretrained_model参数初始化预训练模型 +ResNet50_vd: + +```bash +python -m paddle.distributed.launch \ + --selected_gpus="0" \ + tools/train.py \ + -c ./configs/finetune/ResNet50_vd_finetune.yaml + -o pretrained_model= ResNet50_vd预训练模型 +``` + +ResNet50_vd_ssld: + +```bash +python -m paddle.distributed.launch \ + --selected_gpus="0" \ + tools/train.py \ + -c ./configs/finetune/ResNet50_vd_ssld_finetune.yaml + -o pretrained_model= ResNet50_vd_ssld预训练模型 +``` + + +在使用ResNet50_vd预训练模型对flower102数据进行模型微调后,top1 acc 达到 92.71% +在使用ResNet50_vd_ssld预训练模型对flower102数据进行模型微调后,top1 acc 达到94.96% ### 2.2 模型评估 -- GitLab