Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleClas
提交
2949dae9
P
PaddleClas
项目概览
PaddlePaddle
/
PaddleClas
1 年多 前同步成功
通知
115
Star
4999
Fork
1114
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
19
列表
看板
标记
里程碑
合并请求
6
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleClas
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
19
Issue
19
列表
看板
标记
里程碑
合并请求
6
合并请求
6
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2949dae9
编写于
9月 08, 2021
作者:
G
gaotingquan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs: update faq, test=document_fix
上级
a065c52b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
118 addition
and
45 deletion
+118
-45
docs/zh_CN/faq_series/faq_2021_s2.md
docs/zh_CN/faq_series/faq_2021_s2.md
+118
-45
未找到文件。
docs/zh_CN/faq_series/faq_2021_s2.md
浏览文件 @
2949dae9
...
...
@@ -7,7 +7,7 @@
*
图像分类、识别、检索领域大佬众多,模型和论文更新速度也很快,本文档回答主要依赖有限的项目实践,难免挂一漏万,如有遗漏和不足,也希望有识之士帮忙补充和修正,万分感谢。
## 目录
*
[
近期更新
](
#近期更新
)(
2021.0
8.11
)
*
[
近期更新
](
#近期更新
)(
2021.0
9.08
)
*
[
精选
](
#精选
)
*
[
1. 理论篇
](
#1.理论篇
)
*
[
1.1 PaddleClas基础知识
](
#1.1PaddleClas基础知识
)
...
...
@@ -27,60 +27,69 @@
<a
name=
"近期更新"
></a>
## 近期更新
#### Q2.6.2: 导出inference模型进行预测部署,准确率异常,为什么呢?
**A**
: 该问题通常是由于在导出时未能正确加载模型参数导致的,首先检查模型导出时的日志,是否存在类似下述内容:
```
UserWarning: Skip loading for ***. *** is not found in the provided dict.
```
如果存在,则说明模型权重未能加载成功,请进一步检查配置文件中的
`Global.pretrained_model`
字段,是否正确配置了模型权重文件的路径。模型权重文件后缀名通常为
`pdparams`
,注意在配置该路径时无需填写文件后缀名。
#### Q2.1.7: 在训练时,出现如下报错信息:`ERROR: Unexpected segmentation fault encountered in DataLoader workers.`,如何排查解决问题呢?
**A**
:尝试将训练配置文件中的字段
`num_workers`
设置为
`0`
;尝试将训练配置文件中的字段
`batch_size`
调小一些;检查数据集格式和配置文件中的数据集路径是否正确。
#### Q2.1.4: 数据预处理中,不想对输入数据进行裁剪,该如何设置?或者如何设置剪裁的尺寸。
**A**
: PaddleClas 支持的数据预处理算子可在这里查看:
`ppcls/data/preprocess/__init__.py`
,所有支持的算子均可在配置文件中进行配置,配置的算子名称需要和算子类名一致,参数与对应算子类的构造函数参数一致。如不需要对图像裁剪,则可去掉
`CropImage`
、
`RandCropImage`
,使用
`ResizeImage`
替换即可,可通过其参数设置不同的resize方式, 使用
`size`
参数则直接将图像缩放至固定大小,使用
`resize_short`
参数则会维持图像宽高比进行缩放。设置裁剪尺寸时,可通过
`CropImage`
算子的
`size`
参数,或
`RandCropImage`
算子的
`size`
参数。
#### Q2.1.8: 如何在训练时使用 `Mixup` 和 `Cutmix` ?
**A**
:
*
`Mixup`
的使用方法请参考
[
Mixup
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Mixup.yaml#L63-L65
)
;
`Cuxmix`
请参考
[
Cuxmix
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L63-L65
)
。
#### Q1.1.3: Momentum 优化器中的 momentum 参数是什么意思呢?
**A**
: Momentum 优化器是在 SGD 优化器的基础上引入了“动量”的概念。在 SGD 优化器中,在
`t+1`
时刻,参数
`w`
的更新可表示为:
```
latex
w
_
t+1 = w
_
t - lr * grad
```
其中,
`lr`
为学习率,
`grad`
为此时参数
`w`
的梯度。在引入动量的概念后,参数
`w`
的更新可表示为:
```
latex
v
_
t+1 = m * v
_
t + lr * grad
w
_
t+1 = w
_
t - v
_
t+1
*
在使用
`Mixup`
或
`Cutmix`
时,需要注意:
*
配置文件中的
`Loss.Tranin.CELoss`
需要修改为
`Loss.Tranin.MixCELoss`
,可参考
[
MixCELoss
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L23-L26
)
;
*
使用
`Mixup`
或
`Cutmix`
做训练时无法计算训练的精度(Acc)指标,因此需要在配置文件中取消
`Metric.Train.TopkAcc`
字段,可参考
[
Metric.Train.TopkAcc
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128
)
。
#### Q2.1.9: 训练配置yaml文件中,字段 `Global.pretrain_model` 和 `Global.checkpoints` 分别用于配置什么呢?
**A**
:
*
当需要
`fine-tune`
时,可以通过字段
`Global.pretrain_model`
配置预训练模型权重文件的路径,预训练模型权重文件后缀名通常为
`.pdparams`
;
*
在训练过程中,训练程序会自动保存每个epoch结束时的断点信息,包括优化器信息
`.pdopt`
和模型权重信息
`.pdparams`
。在训练过程意外中断等情况下,需要恢复训练时,可以通过字段
`Global.checkpoints`
配置训练过程中保存的断点信息文件,例如通过配置
`checkpoints: ./output/ResNet18/epoch_18`
即可恢复18epoch训练结束时的断点信息,PaddleClas将自动加载
`epoch_18.pdopt`
和
`epoch_18.pdparams`
,从19epoch继续训练。
#### Q2.6.3: 如何将模型转为 `ONNX` 格式?
**A**
:Paddle支持两种转ONNX格式模型的方式,且依赖于
`paddle2onnx`
工具,首先需要安装
`paddle2onnx`
:
```
shell
pip
install
paddle2onnx
```
其中,
`m`
即为动量
`momentum`
,表示累积动量的加权值,一般取
`0.9`
,当取值小于
`1`
时,则越早期的梯度对当前的影响越小,例如,当动量参数
`m`
取
`0.9`
时,在
`t`
时刻,
`t-5`
的梯度加权值为
`0.9 ^ 5 = 0.59049`
,而
`t-2`
时刻的梯度加权值为
`0.9 ^ 2 = 0.81`
。因此,太过“久远”的梯度信息对当前的参考意义很小,而“最近”的历史梯度信息对当前影响更大,这也是符合直觉的。
<div
align=
"center"
>
<img
src=
"../../images/faq/momentum.jpeg"
width=
"400"
>
</div>
*
从 inference model 转为 ONNX 格式模型:
*该图来自 `https://blog.csdn.net/tsyccnh/article/details/76270707`*
以动态图导出的 `combined` 格式 inference model(包含 `.pdmodel` 和 `.pdiparams` 两个文件)为例,使用以下命令进行模型格式转换:
```shell
paddle2onnx --model_dir ${model_path} --model_filename ${model_path}/inference.pdmodel --params_filename ${model_path}/inference.pdiparams --save_file ${save_path}/model.onnx --enable_onnx_checker True
```
上述命令中:
* `model_dir`:该参数下需要包含 `.pdmodel` 和 `.pdiparams` 两个文件;
* `model_filename`:该参数用于指定参数 `model_dir` 下的 `.pdmodel` 文件路径;
* `params_filename`:该参数用于指定参数 `model_dir` 下的 `.pdiparams` 文件路径;
* `save_file`:该参数用于指定转换后的模型保存目录路径。
通过引入动量的概念,在参数更新时考虑了历史更新的影响,因此可以加快收敛速度,也改善了
`SGD`
优化器带来的损失(cost、loss)震荡问题
。
关于静态图导出的非 `combined` 格式的 inference model(通常包含文件 `__model__` 和多个参数文件)转换模型格式,以及更多参数说明请参考 paddle2onnx 官方文档 [paddle2onnx](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md#%E5%8F%82%E6%95%B0%E9%80%89%E9%A1%B9)
。
#### Q1.1.4: PaddleClas 是否有 `Fixing the train-test resolution discrepancy` 这篇论文的实现呢?
**A**
: 目前 PaddleClas 没有实现。如果需要,可以尝试自己修改代码。简单来说,该论文所提出的思想是使用较大分辨率作为输入,对已经训练好的模型最后的FC层进行fine-tune。具体操作上,首先在较低分辨率的数据集上对模型网络进行训练,完成训练后,对网络除最后的FC层外的其他层的权重设置参数
`stop_gradient=True`
,然后使用较大分辨率的输入对网络进行fine-tune训练。
*
直接从模型组网代码导出ONNX格式模型:
#### Q1.6.2: PaddleClas 图像识别用于 Eval 的配置文件中,`Query` 和 `Gallery` 配置具体是用于做什么呢?
**A**
:
`Query`
与
`Gallery`
均为数据集配置,其中
`Gallery`
用于配置底库数据,
`Query`
用于配置验证集。在进行 Eval 时,首先使用模型对
`Gallery`
底库数据进行前向计算特征向量,特征向量用于构建底库,然后模型对
`Query`
验证集中的数据进行前向计算特征向量,再与底库计算召回率等指标。
以动态图模型组网代码为例,模型类为继承于 `paddle.nn.Layer` 的子类,代码如下所示:
#### Q2.1.5: PaddlePaddle 安装后,使用报错,无法导入 paddle 下的任何模块(import paddle.xxx),是为什么呢?
**A**
: 首先可以使用以下代码测试 Paddle 是否安装正确:
```
python
import
paddle
paddle
.
utils
.
install_check
.
run_check
(
)
```
正确安装时,通常会有如下提示:
```
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
```
如未能安装成功,则会有相应问题的提示。
另外,在同时安装CPU版本和GPU版本Paddle后,由于两个版本存在冲突,需要将两个版本全部卸载,然后重新安装所需要的版本。
```python
import paddle
from paddle.static import InputSpec
#### Q2.1.6: 使用PaddleClas训练时,如何设置仅保存最优模型?不想保存中间模型。
**A**
: PaddleClas在训练过程中,会保存/更新以下三类模型:
1.
最新的模型(
`latest.pdopt`
,
`latest.pdparams`
,
`latest.pdstates`
),当训练意外中断时,可使用最新保存的模型恢复训练;
2.
最优的模型(
`best_model.pdopt`
,
`best_model.pdparams`
,
`best_model.pdstates`
);
3.
训练过程中,一个epoch结束时的断点(
`epoch_xxx.pdopt`
,
`epoch_xxx.pdparams`
,
`epoch_xxx.pdstates`
)。训练配置文件中
`Global.save_interval`
字段表示该模型的保存间隔。将该字段设置大于总epochs数,则不再保存中间断点模型。
class SimpleNet(paddle.nn.Layer):
def __init__(self):
pass
def forward(self, x):
pass
net = SimpleNet()
x_spec = InputSpec(shape=[None, 3, 224, 224], dtype='float32', name='x')
paddle.onnx.export(layer=net, path="./SimpleNet", input_spec=[x_spec])
```
其中:
* `InputSpec()` 函数用于描述模型输入的签名信息,包括输入数据的 `shape`、`type` 和 `name`(可省略);
* `paddle.onnx.export()` 函数需要指定模型组网对象 `net`,导出模型的保存路径 `save_path`,模型的输入数据描述 `input_spec`。
需要注意,`paddlepaddle` 版本需大于 `2.0.0`。关于 `paddle.onnx.export()` 函数的更多参数说明请参考[paddle.onnx.export](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/onnx/export_cn.html#export)。
#### Q2.5.4: 在 build 检索底库时,参数 `pq_size` 应该如何设置?
**A**
:
`pq_size`
是PQ检索算法的参数。PQ检索算法可以简单理解为“分层”检索算法,
`pq_size`
是每层的“容量”,因此该参数的设置会影响检索性能,不过,在底库总数据量不太大(小于10000张)的情况下,这个参数对性能的影响很小,因此对于大多数使用场景而言,在构建底库时无需修改该参数。关于PQ检索算法的更多内容,可以查看相关
[
论文
](
https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf
)
。
<a
name=
"精选"
></a>
## 精选
...
...
@@ -204,6 +213,22 @@ PaddlePaddle is installed successfully! Let's start deep learning with PaddlePad
2.
最优的模型(
`best_model.pdopt`
,
`best_model.pdparams`
,
`best_model.pdstates`
);
3.
训练过程中,一个epoch结束时的断点(
`epoch_xxx.pdopt`
,
`epoch_xxx.pdparams`
,
`epoch_xxx.pdstates`
)。训练配置文件中
`Global.save_interval`
字段表示该模型的保存间隔。将该字段设置大于总epochs数,则不再保存中间断点模型。
#### Q2.1.7: 在训练时,出现如下报错信息:`ERROR: Unexpected segmentation fault encountered in DataLoader workers.`,如何排查解决问题呢?
**A**
:尝试将训练配置文件中的字段
`num_workers`
设置为
`0`
;尝试将训练配置文件中的字段
`batch_size`
调小一些;检查数据集格式和配置文件中的数据集路径是否正确。
#### Q2.1.8: 如何在训练时使用 `Mixup` 和 `Cutmix` ?
**A**
:
*
`Mixup`
的使用方法请参考
[
Mixup
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Mixup.yaml#L63-L65
)
;
`Cuxmix`
请参考
[
Cuxmix
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L63-L65
)
。
*
在使用
`Mixup`
或
`Cutmix`
时,需要注意:
*
配置文件中的
`Loss.Tranin.CELoss`
需要修改为
`Loss.Tranin.MixCELoss`
,可参考
[
MixCELoss
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L23-L26
)
;
*
使用
`Mixup`
或
`Cutmix`
做训练时无法计算训练的精度(Acc)指标,因此需要在配置文件中取消
`Metric.Train.TopkAcc`
字段,可参考
[
Metric.Train.TopkAcc
](
https://github.com/PaddlePaddle/PaddleClas/blob/cf9fc9363877f919996954a63716acfb959619d0/ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128
)
。
#### Q2.1.9: 训练配置yaml文件中,字段 `Global.pretrain_model` 和 `Global.checkpoints` 分别用于配置什么呢?
**A**
:
*
当需要
`fine-tune`
时,可以通过字段
`Global.pretrain_model`
配置预训练模型权重文件的路径,预训练模型权重文件后缀名通常为
`.pdparams`
;
*
在训练过程中,训练程序会自动保存每个epoch结束时的断点信息,包括优化器信息
`.pdopt`
和模型权重信息
`.pdparams`
。在训练过程意外中断等情况下,需要恢复训练时,可以通过字段
`Global.checkpoints`
配置训练过程中保存的断点信息文件,例如通过配置
`checkpoints: ./output/ResNet18/epoch_18`
即可恢复18epoch训练结束时的断点信息,PaddleClas将自动加载
`epoch_18.pdopt`
和
`epoch_18.pdparams`
,从19epoch继续训练。
<a
name=
"2.2图像分类"
></a>
### 2.2 图像分类
...
...
@@ -255,6 +280,9 @@ PaddlePaddle is installed successfully! Let's start deep learning with PaddlePad
#### Q2.5.3: Mac重新编译index.so时报错如下:clang: error: unsupported option '-fopenmp', 该如何处理?
**A**
:该问题已经解决。可以参照
[
文档
](
../../../develop/deploy/vector_search/README.md
)
重新编译 index.so。
#### Q2.5.4: 在 build 检索底库时,参数 `pq_size` 应该如何设置?
**A**
:
`pq_size`
是PQ检索算法的参数。PQ检索算法可以简单理解为“分层”检索算法,
`pq_size`
是每层的“容量”,因此该参数的设置会影响检索性能,不过,在底库总数据量不太大(小于10000张)的情况下,这个参数对性能的影响很小,因此对于大多数使用场景而言,在构建底库时无需修改该参数。关于PQ检索算法的更多内容,可以查看相关
[
论文
](
https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf
)
。
<a
name=
"2.6模型预测部署"
></a>
### 2.6 模型预测部署
...
...
@@ -267,3 +295,48 @@ PaddlePaddle is installed successfully! Let's start deep learning with PaddlePad
UserWarning: Skip loading for ***. *** is not found in the provided dict.
```
如果存在,则说明模型权重未能加载成功,请进一步检查配置文件中的
`Global.pretrained_model`
字段,是否正确配置了模型权重文件的路径。模型权重文件后缀名通常为
`pdparams`
,注意在配置该路径时无需填写文件后缀名。
#### Q2.6.3: 如何将模型转为 `ONNX` 格式?
**A**
:Paddle支持两种转ONNX格式模型的方式,且依赖于
`paddle2onnx`
工具,首先需要安装
`paddle2onnx`
:
```
shell
pip
install
paddle2onnx
```
*
从 inference model 转为 ONNX 格式模型:
以动态图导出的 `combined` 格式 inference model(包含 `.pdmodel` 和 `.pdiparams` 两个文件)为例,使用以下命令进行模型格式转换:
```shell
paddle2onnx --model_dir ${model_path} --model_filename ${model_path}/inference.pdmodel --params_filename ${model_path}/inference.pdiparams --save_file ${save_path}/model.onnx --enable_onnx_checker True
```
上述命令中:
* `model_dir`:该参数下需要包含 `.pdmodel` 和 `.pdiparams` 两个文件;
* `model_filename`:该参数用于指定参数 `model_dir` 下的 `.pdmodel` 文件路径;
* `params_filename`:该参数用于指定参数 `model_dir` 下的 `.pdiparams` 文件路径;
* `save_file`:该参数用于指定转换后的模型保存目录路径。
关于静态图导出的非 `combined` 格式的 inference model(通常包含文件 `__model__` 和多个参数文件)转换模型格式,以及更多参数说明请参考 paddle2onnx 官方文档 [paddle2onnx](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md#%E5%8F%82%E6%95%B0%E9%80%89%E9%A1%B9)。
*
直接从模型组网代码导出ONNX格式模型:
以动态图模型组网代码为例,模型类为继承于 `paddle.nn.Layer` 的子类,代码如下所示:
```python
import paddle
from paddle.static import InputSpec
class SimpleNet(paddle.nn.Layer):
def __init__(self):
pass
def forward(self, x):
pass
net = SimpleNet()
x_spec = InputSpec(shape=[None, 3, 224, 224], dtype='float32', name='x')
paddle.onnx.export(layer=net, path="./SimpleNet", input_spec=[x_spec])
```
其中:
* `InputSpec()` 函数用于描述模型输入的签名信息,包括输入数据的 `shape`、`type` 和 `name`(可省略);
* `paddle.onnx.export()` 函数需要指定模型组网对象 `net`,导出模型的保存路径 `save_path`,模型的输入数据描述 `input_spec`。
需要注意,`paddlepaddle` 版本需大于 `2.0.0`。关于 `paddle.onnx.export()` 函数的更多参数说明请参考[paddle.onnx.export](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/onnx/export_cn.html#export)。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录