config_description.md 11.8 KB
Newer Older
C
cuicheng01 已提交
1 2 3 4 5 6 7 8 9
# 配置说明

---

## 简介

本文档介绍了PaddleClas配置文件(`ppcls/configs/*.yaml`)中各参数的含义,以便您更快地自定义或修改超参数配置。


C
cuicheng01 已提交
10

C
cuicheng01 已提交
11 12
## 配置详解

C
cuicheng01 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
### 目录

- [分类模型](#1)
  - [1.1 全局配置(Global)](#1.1)
  - [1.2 结构(Arch)](#1.2)
  - [1.3 损失函数(Loss)](#1.3)
  - [1.4 优化器(Optimizer)](#1.4)
  - [1.5数据读取模块(DataLoader)](#1.5)
      - [1.5.1 dataset](#1.5.1)
      - [1.5.1 sampler](#1.5.2)
      - [1.5.1 loader](#1.5.3)
  - [1.6 评估指标(Metric)](#1.6)
- [蒸馏模型](#2)
  - [2.1 结构(Arch)](#2.1)
  - [2.2 损失函数(Loss)](#2.2)
  - [2.3 评估指标(Metric)](#2.3)
- [识别模型](#3)
  - [3.1 结构(Arch)](#3.1)
  - [3.2 评估指标(Metric)](#3.2)
  
<a name="1"></a>
C
cuicheng01 已提交
34 35 36 37
### 1.分类模型

此处以`ResNet50_vd``ImageNet-1k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml)

C
cuicheng01 已提交
38
<a name="1.1"></a>
C
cuicheng01 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#### 1.1 全局配置(Global)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| checkpoints | 断点模型路径,用于恢复训练 | null | str |
| pretrained_model | 预训练模型路径 | null | str |
| output_dir | 保存模型路径 | "./output/" | str |
| save_interval | 每隔多少个epoch保存模型 | 1 | int |
| eval_during_train| 是否在训练时进行评估 | True | bool |
| eval_interval | 每隔多少个epoch进行模型评估 | 1 | int |
| epochs | 训练总epoch数 |  | int |
| print_batch_step | 每隔多少个mini-batch打印输出 | 10 | int |
| use_visualdl | 是否是用visualdl可视化训练过程 | False | bool |
| image_shape | 图片大小 | [3,224,224] | list, shape: (3,) |
| save_inference_dir | inference模型的保存路径 | "./inference" | str |
| eval_mode | eval的模式 | "classification" | "retrieval" |
| to_static | 是否改为静态图模式 | False | True |
| ues_dali | 是否使用dali库进行图像预处理 | False | True |

**注**`pretrained_model`也可以填写存放预训练模型的http地址。

C
cuicheng01 已提交
60
<a name="1.2"></a>
C
cuicheng01 已提交
61 62 63 64 65 66 67 68 69 70
#### 1.2 结构(Arch)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| name | 模型结构名字 | ResNet50 | PaddleClas提供的模型结构 |
| class_num | 分类数 | 1000 | int |
| pretrained | 预训练模型 | False | bool, str |

**注**:此处的pretrained可以设置为`True`或者`False`,也可以设置权重的路径。另外当`Global.pretrained_model`也设置相应路径时,此处的`pretrained`失效。

C
cuicheng01 已提交
71
<a name="1.3"></a>
C
cuicheng01 已提交
72 73 74 75 76 77 78 79
#### 1.3 损失函数(Loss)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| CELoss | 交叉熵损失函数 | —— | —— |
| CELoss.weight | CELoss的在整个Loss中的权重 | 1.0 | float |
| CELoss.epsilon | CELoss中label_smooth的epsilon值 | 0.1 | float,0-1之间 |

C
cuicheng01 已提交
80
<a name="1.4"></a>
C
cuicheng01 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
#### 1.4 优化器(Optimizer)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| name | 优化器方法名 | "Momentum" | "RmsProp"等其他优化器 |
| momentum | momentum值 | 0.9 | float |
| lr.name | 学习率下降方式 | "Cosine" | "Linear"、"Piecewise"等其他下降方式 |
| lr.learning_rate | 学习率初始值 | 0.1 | float |
| lr.warmup_epoch | warmup轮数 | 0 | int,如5 |
| regularizer.name | 正则化方法名 | "L2" | ["L1", "L2"] |
| regularizer.coeff | 正则化系数 | 0.00007 | float |

**注**`lr.name`不同时,新增的参数可能也不同,如当`lr.name=Piecewise`时,需要添加如下参数:

```
  lr:
    name: Piecewise
    learning_rate: 0.1
    decay_epochs: [30, 60, 90]
    values: [0.1, 0.01, 0.001, 0.0001]
```

添加方法及参数请查看[learning_rate.py](../../../ppcls/optimizer/learning_rate.py)

C
cuicheng01 已提交
105
<a name="1.5"></a>
C
cuicheng01 已提交
106 107
#### 1.5数据读取模块(DataLoader)

C
cuicheng01 已提交
108
<a name="1.5.1"></a>
C
cuicheng01 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
##### 1.5.1 dataset

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| name | 读取数据的类的名字 | ImageNetDataset | VeriWild等其他读取数据类的名字 |
| image_root | 数据集存放的路径 | ./dataset/ILSVRC2012/ | str |
| cls_label_path | 数据集标签list | ./dataset/ILSVRC2012/train_list.txt | str |
| transform_ops | 单张图片的数据预处理 | —— | —— |
| batch_transform_ops | batch图片的数据预处理 | —— | —— |


transform_ops中参数的意义:

| 功能名字 | 参数名字 | 具体含义 |
|:---:|:---:|:---:|
| DecodeImage | to_rgb | 数据转RGB |
|  | channel_first | 按CHW排列的图片数据 |
| RandCropImage | size | 随机裁剪 |
| RandFlipImage | | 随机翻转 |
| NormalizeImage | scale | 归一化scale值 |
|  | mean | 归一化均值 |
|  | std | 归一化方差 |
|  | order | 归一化顺序 |
| CropImage | size | 裁剪大小 |
| ResizeImage | resize_short | 按短边调整大小 |

batch_transform_ops中参数的含义:

| 功能名字 | 参数名字 | 具体含义 |
|:---:|:---:|:---:|
| MixupOperator | alpha | Mixup参数值,该值越大增强越强 |

C
cuicheng01 已提交
141
<a name="1.5.2"></a>
C
cuicheng01 已提交
142 143 144 145 146 147 148 149 150
##### 1.5.2 sampler

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| name |  sampler类型 | DistributedBatchSampler | DistributedRandomIdentitySampler等其他Sampler |
| batch_size | 批大小 | 64 | int |
| drop_last | 是否丢掉最后不够batch-size的数据 | False | bool |
| shuffle | 数据是否做shuffle | True | bool |

C
cuicheng01 已提交
151
<a name="1.5.3"></a>
C
cuicheng01 已提交
152 153 154 155 156 157 158
##### 1.5.3 loader

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| num_workers | 数据读取线程数 | 4 | int |
| use_shared_memory | 是否使用共享内存 | True | bool |

C
cuicheng01 已提交
159
<a name="1.6"></a>
C
cuicheng01 已提交
160 161 162 163 164 165
#### 1.6 评估指标(Metric)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| TopkAcc | TopkAcc | [1, 5] | list, int |

C
cuicheng01 已提交
166
<a name="1.7"></a>
C
cuicheng01 已提交
167 168 169 170 171 172 173 174 175 176 177 178
#### 1.7 预测(Infer)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| infer_imgs | 被infer的图像的地址 | docs/images/whl/demo.jpg | str |
| batch_size | 批大小 | 10 | int |
| PostProcess.name | 后处理名字 | Topk | str |
| PostProcess.topk | topk的值 | 5 | int |
| PostProcess.class_id_map_file | class id和名字的映射文件 | ppcls/utils/imagenet1k_label_list.txt | str |

**注**:Infer模块的`transforms`的解释参考数据读取模块中的dataset中`transform_ops`的解释。

C
cuicheng01 已提交
179
<a name="2"></a>
C
cuicheng01 已提交
180 181 182 183
### 2.蒸馏模型

**注**:此处以`MobileNetV3_large_x1_0``ImageNet-1k`上蒸馏`MobileNetV3_small_x1_0`的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/Distillation/mv3_large_x1_0_distill_mv3_small_x1_0.yaml)。这里只介绍与分类模型有区别的参数。

C
cuicheng01 已提交
184
<a name="2.1"></a>
C
cuicheng01 已提交
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
#### 2.1 结构(Arch)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| name | 模型结构名字 | DistillationModel | —— |
| class_num | 分类数 | 1000 | int |
| freeze_params_list | 冻结参数列表 | [True, False] | list |
| models | 模型列表 | [Teacher, Student] | list |
| Teacher.name | 教师模型的名字 | MobileNetV3_large_x1_0 | PaddleClas中的模型 |
| Teacher.pretrained | 教师模型预训练权重 | True | 布尔值或者预训练权重路径 |
| Teacher.use_ssld | 教师模型预训练权重是否是ssld权重 | True | 布尔值 |
| infer_model_name | 被infer模型的类型 | Student | Teacher |

**注**

1.list在yaml中体现如下:
```
  freeze_params_list:
  - True
  - False
```
2.Student的参数情况类似,不再赘述。

C
cuicheng01 已提交
208
<a name="2.2"></a>
C
cuicheng01 已提交
209 210 211 212 213 214 215 216 217 218 219
#### 2.2 损失函数(Loss)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| DistillationCELoss | 蒸馏的交叉熵损失函数 | —— | —— |
| DistillationCELoss.weight | Loss权重 | 1.0 | float |
| DistillationCELoss.model_name_pairs |  ["Student", "Teacher"] | —— | —— |
| DistillationGTCELoss.weight | 蒸馏的模型与真实Label的交叉熵损失函数 | —— | —— |
| DistillationGTCELos.weight | Loss权重 | 1.0 | float |
| DistillationCELoss.model_names | 与真实label作交叉熵的模型名字 | ["Student"] | —— |

C
cuicheng01 已提交
220
<a name="2.3"></a>
C
cuicheng01 已提交
221 222 223 224 225 226 227 228 229 230
#### 2.3 评估指标(Metric)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| DistillationTopkAcc | DistillationTopkAcc | 包含model_key和topk两个参数 | —— |
| DistillationTopkAcc.model_key | 被评估的模型 | "Student" | "Teacher" |
| DistillationTopkAcc.topk | Topk的值 | [1, 5] | list, int |

**注**`DistillationTopkAcc`与普通`TopkAcc`含义相同,只是只用在蒸馏任务中。

C
cuicheng01 已提交
231
<a name="3"></a>
C
cuicheng01 已提交
232 233 234 235
### 3. 识别模型

**注**:此处以`ResNet50``LogoDet-3k`上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/Logo/ResNet50_ReID.yaml)。这里只介绍与分类模型有区别的参数。

C
cuicheng01 已提交
236
<a name="3.1"></a>
C
cuicheng01 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
#### 3.1 结构(Arch)

|     参数名字      |         具体含义          |   默认值   |                            可选值                            |
| :---------------: | :-----------------------: | :--------: | :----------------------------------------------------------: |
|       name        |         模型结构          | "RecModel" |                         ["RecModel"]                         |
| infer_output_key  |    inference时的输出值    | “feature”  |                    ["feature", "logits"]                     |
| infer_add_softmax |  infercne是否添加softmax  |    False   |                        [True, False]                         |
|     Backbone.name      |    Backbone的名字     |      ResNet50_last_stage_stride1     | PaddleClas提供的其他backbone |
|     Backbone.pretrained      |   Backbone预训练模型    |      True      | 布尔值或者预训练模型路径 |
| BackboneStopLayer.name | Backbone中的输出层名字 |     True       | Backbone中的特征输出层的`full_name` |
|       Neck.name        |    网络Neck部分名字     |      VehicleNeck      |           需传入字典结构,Neck网络层的具体输入参数           |
|       Neck.in_channels        |    输入Neck部分的维度大小     |      2048      |        与BackboneStopLayer.name层的大小相同           |
|       Neck.out_channels        |    输出Neck部分的维度大小,即特征维度大小    |      512     |        int           |
|       Head.name        |    网络Head部分名字     |      CircleMargin      |           Arcmargin等           |
|       Head.embedding_size        |    特征维度大小      |      512      |           与Neck.out_channels保持一致           |
|       Head.class_num        |    类别数     |      3000      |           int           |
|       Head.margin        |    CircleMargin中的margin值     |      0.35      |           float          |
|       Head.scale        |    CircleMargin中的scale值     |      64      |           int          |

**注**

1.在PaddleClas中,`Neck`部分是Backbone与embedding层的连接部分,`Head`部分是embedding层与分类层的连接部分。

2.`BackboneStopLayer.name`的获取方式可以通过将模型可视化后获取,可视化方式可以参考[Netron](https://github.com/lutzroeder/netron)或者[visualdl](https://github.com/PaddlePaddle/VisualDL)

3.调用`tools/export_model.py`会将模型的权重转为inference model,其中`infer_add_softmax`参数会控制是否在其后增加`Softmax`激活函数,代码中默认为`True`(分类任务中最后的输出层会接`Softmax`激活函数),识别任务中特征层无须接激活函数,此处要设置为`False`

C
cuicheng01 已提交
264
<a name="3.2"></a>
C
cuicheng01 已提交
265 266 267 268 269 270
#### 3.2 评估指标(Metric)

| 参数名字 | 具体含义 | 默认值 | 可选值 |
|:---:|:---:|:---:|:---:|
| Recallk| 召回率 | [1, 5] | list, int |
| mAP| 平均检索精度 | None | None |