Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleClas
提交
8eaef77a
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看板
提交
8eaef77a
编写于
11月 29, 2021
作者:
S
sibo2rr
提交者:
gaotingquan
12月 09, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add missing space
上级
d1cef4a5
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
13 addition
and
13 deletion
+13
-13
docs/zh_CN/faq_series/faq_2021_s1.md
docs/zh_CN/faq_series/faq_2021_s1.md
+7
-7
docs/zh_CN/faq_series/faq_2021_s2.md
docs/zh_CN/faq_series/faq_2021_s2.md
+1
-1
docs/zh_CN/faq_series/faq_selected_30.md
docs/zh_CN/faq_series/faq_selected_30.md
+5
-5
未找到文件。
docs/zh_CN/faq_series/faq_2021_s1.md
浏览文件 @
8eaef77a
...
...
@@ -33,7 +33,7 @@
### Q1.3 在 docker 中训练的时候,数据路径和配置均没问题,但是一直报错 `SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception`,这是为什么呢?
**A**
:这可能是因为 docker 中共享内存太小导致的。创建 docker 的时候,
`/dev/shm`
的默认大小为 64M,如果使用多进程读取数据,共享内存可能不够,因此需要给
`/dev/shm`
分配更大的空间,在创建 docker 的时候,传入
`--shm-size=8g`
表示给
`/dev/shm`
分配 8g
的空间,一般是够用的。
**A**
:这可能是因为 docker 中共享内存太小导致的。创建 docker 的时候,
`/dev/shm`
的默认大小为 64M,如果使用多进程读取数据,共享内存可能不够,因此需要给
`/dev/shm`
分配更大的空间,在创建 docker 的时候,传入
`--shm-size=8g`
表示给
`/dev/shm`
分配 8G
的空间,一般是够用的。
### Q1.4 PaddleClas 提供的 10W 类图像分类预训练模型在哪里下载,应该怎么使用呢?
...
...
@@ -87,7 +87,7 @@
另外,Plain 结构对于剪枝操作也更为友好。
注:“Plain 结构”与“结构重参数化(structural re-parameterization)技术”出自论文“RepVGG: Making VGG-style ConvNets Great Again”。Plain 结构网络模型指整个网络不存在分支结构,也即网络中第
`i`
层 layer 的输入为第
`i-1`
层 layer 的输出,第
`i`
层 layer 的输出为第
`i+1
`
层 layer 的输入。
注:“Plain 结构”与“结构重参数化(structural re-parameterization)技术”出自论文“RepVGG: Making VGG-style ConvNets Great Again”。Plain 结构网络模型指整个网络不存在分支结构,也即网络中第
`i`
层 layer 的输入为第
`i-1`
层 layer 的输出,第
`i`
层 layer 的输出为第
`i+1
`
层 layer 的输入。
### Q3.2: ACNet 的创新点主要在哪里?
**A**
:
...
...
@@ -126,7 +126,7 @@ ACNet 意为“Asymmetric Convolution Block”,即为非对称卷积模块,
首先训练阶段的 RepVGG 采用多分支结构,可以看作是在传统 VGG 网络的基础上,增加了
`1*1`
卷积和恒等映射的残差结构,而推理阶段的 RepVGG 则退化为 VGG 结构。训练阶段 RepVGG 到推理阶段 RepVGG 的网络结构转换使用“结构重参数化”技术实现。
对于恒等映射,可将其视为参数均为
`1`
的
`1*1`
卷积核作用在输入特征图的输出结果,因此训练阶段的 RepVGG 的卷积模块可以视为两个
`
1*1`
卷积和一个
`3*3`
卷积,而
`1*1`
卷积的参数又可以直接相加到
`3*3`
卷积核中心位置的参数上(该操作类似于 ACNet 中,非对称卷积核参数相加到方形卷积核骨架位置参数的操作),通过上述操作,即可在推理阶段,将网络结构中的恒等映射、
`1*1 `
卷积、
`3*3`
卷积三个分支合并为一个
`3*3`
卷积,详见
`Q3.4`
。
对于恒等映射,可将其视为参数均为
`1`
的
`1*1`
卷积核作用在输入特征图的输出结果,因此训练阶段的 RepVGG 的卷积模块可以视为两个
`
1*1`
卷积和一个
`3*3`
卷积,而
`1*1`
卷积的参数又可以直接相加到
`3*3`
卷积核中心位置的参数上(该操作类似于 ACNet 中,非对称卷积核参数相加到方形卷积核骨架位置参数的操作),通过上述操作,即可在推理阶段,将网络结构中的恒等映射、
`1*1 `
卷积、
`3*3`
卷积三个分支合并为一个
`3*3`
卷积,详见
`Q3.4`
。
### Q3.4: ACNet 与 RepVGG 中的 struct re-parameters 有何异同?
...
...
@@ -180,7 +180,7 @@ RepVGG 网络与 ACNet 同理,只不过 ACNet 的 `1*d` 非对称卷积变成
**A**
:
1.
图像对 CNN 的依赖是不必要的,利用 Transformer 的计算效率和可伸缩性,可以训练很大模型,当模型和数据集增大的情形下,仍然不会存在饱和的情况。受到 Transformer 在 NLP 上的启发,在图像分类任务中使用时,将图片分成顺序排列的 patches,并将这些 patches 输入一个线性单元嵌入到 embedding 作为 transformer 的输入。
2.
在中等规模数据集中如 ImageNet1k,ImageNet21k,视觉 Transformer 模型低于相同规模尺寸的 ResNet 几个百分点。猜测这是因为 transformer 缺少 CNN 所具有的局部性(Locality)和空间不变性(Spatial Invariance)的特点,而在数据量不够大的时候,难以超越卷积网络,不过对于这一问题,
[
DeiT
](
https://arxiv.org/abs/2012.12877
)
使用数据增强的方式在一定程度上解决了 Vision Transformer 依赖超大规模数据集训练的问题。
2.
在中等规模数据集中如 ImageNet1k,ImageNet21k,视觉 Transformer 模型低于相同规模尺寸的 ResNet 几个百分点。猜测这是因为 transformer 缺少 CNN 所具有的局部性(Locality)和空间不变性(Spatial Invariance)的特点,而在数据量不够大的时候,难以超越卷积网络,不过对于这一问题,
[
DeiT
](
https://arxiv.org/abs/2012.12877
)
使用数据增强的方式在一定程度上解决了 Vision Transformer 依赖超大规模数据集训练的问题。
3.
在超大规模数据集 14M-300M 训练时,这种方式可以越过局部信息,建模更加长距离的依赖关系,而 CNN 能较好关注局部信息全局信息捕获能力较弱。
...
...
@@ -209,13 +209,13 @@ RepVGG 网络与 ACNet 同理,只不过 ACNet 的 `1*d` 非对称卷积变成
<img
src=
"../../images/faq/ViT_structure.png"
width=
"400"
>
</div>
4.
如上图,给定一个
`H×W×C`
的图像以及区块大小 P,可以把图像划分为
`N`
个
`P×P×C`
的区块,
`N=H×W/(P×P)`
。得到区块后要使用线性变换转为 D 维特征向量,再加上位置编码向量即可。和 BERT 类似,ViT 在序列之前也加入了一个分类标志位,记为
`[CLS]`
。ViT 输入序列
`z`
如下面的公式所示,其中
`x`
表示一个图像区块。
4.
如上图,给定一个
`H×W×C`
的图像以及区块大小 P,可以把图像划分为
`N`
个
`P×P×C`
的区块,
`N=H×W/(P×P)`
。得到区块后要使用线性变换转为 D 维特征向量,再加上位置编码向量即可。和 BERT 类似,ViT 在序列之前也加入了一个分类标志位,记为
`[CLS]`
。ViT 输入序列
`z`
如下面的公式所示,其中
`x`
表示一个图像区块。
<div
align=
"center"
>
<img
src=
"../../images/faq/ViT.png"
width=
"400"
>
</div>
5.
ViT 模型和 Transformer 基本一样,输入序列传入 ViT,然后利用
`[CLS]`
标志位的最终输出特征进行分类。ViT 主要由 MSA(多头自注意力)和 MLP(两层使用 GELU 激活函数的全连接网络)组成,在 MSA 和 MLP 之前加上 LayerNorm 和残差连接。
5.
ViT 模型和 Transformer 基本一样,输入序列传入 ViT,然后利用
`[CLS]`
标志位的最终输出特征进行分类。ViT 主要由 MSA(多头自注意力)和 MLP(两层使用 GELU 激活函数的全连接网络)组成,在 MSA 和 MLP 之前加上 LayerNorm 和残差连接。
### Q4.4: 如何理解归纳偏置 Inductive Bias?
...
...
@@ -229,7 +229,7 @@ RepVGG 网络与 ACNet 同理,只不过 ACNet 的 `1*d` 非对称卷积变成
**A**
:
1.
和 BERT 相类似,ViT 在第一个 patch 前添加一个
`[CLS]`
标志位,最后一个结束标志位对应的向量可以作为整个图像的语义表示,从而用于下游的分类任务等。从而使得整个 embedding 组可以表征该图像不同位置的特征。
2.
将
`[CLS]`
标志位对应的向量作为整个图像的语义表示,是因为与图像中已有的其它 patch 块图像相比,这个无明显语义信息的符号会更“公平”地融合图像中各个 patch 的语义信息,从而更好的表示整个图像的语义。
2.
将
`[CLS]`
标志位对应的向量作为整个图像的语义表示,是因为与图像中已有的其它 patch 块图像相比,这个无明显语义信息的符号会更“公平”地融合图像中各个 patch 的语义信息,从而更好的表示整个图像的语义。
<a
name=
"5"
></a>
## 第 5 期
...
...
docs/zh_CN/faq_series/faq_2021_s2.md
浏览文件 @
8eaef77a
...
...
@@ -34,7 +34,7 @@
**A**
:
*
`Mixup`
的使用方法请参考
[
Mixup
](
../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Mixup.yaml#L63-L65
)
;
`Cuxmix`
请参考
[
Cuxmix
](
../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L63-L65
)
。
*
使用
`Mixup`
或
`Cutmix`
做训练时无法计算训练的精度
(Acc)
指标,因此需要在配置文件中取消
`Metric.Train.TopkAcc`
字段,可参考
[
Metric.Train.TopkAcc
](
../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128
)
。
*
使用
`Mixup`
或
`Cutmix`
做训练时无法计算训练的精度
(Acc)
指标,因此需要在配置文件中取消
`Metric.Train.TopkAcc`
字段,可参考
[
Metric.Train.TopkAcc
](
../../../ppcls/configs/ImageNet/DataAugment/ResNet50_Cutmix.yaml#L125-L128
)
。
#### Q2.1.9: 训练配置 yaml 文件中,字段 `Global.pretrain_model` 和 `Global.checkpoints` 分别用于配置什么呢?
**A**
:
...
...
docs/zh_CN/faq_series/faq_selected_30.md
浏览文件 @
8eaef77a
...
...
@@ -47,7 +47,7 @@
>>
*
Q: 注意力机制是什么?目前有哪些比较常用的注意力机制方法?
*
A: 注意力机制
(Attention Mechanism)
源于对人类视觉的研究。将注意力机制用在计算机视觉任务上,可以有效捕捉图片中有用的区域,从而提升整体网络性能。目前比较常用的有
[
SE block
](
https://arxiv.org/abs/1709.01507
)
、
[
SK-block
](
https://arxiv.org/abs/1903.06586
)
、
[
Non-local block
](
https://arxiv.org/abs/1711.07971
)
、
[
GC block
](
https://arxiv.org/abs/1904.11492
)
、
[
CBAM
](
https://arxiv.org/abs/1807.06521
)
等,核心思想就是去学习特征图在不同区域或者不同通道中的重要性,从而让网络更加注意显著性的区域。
*
A: 注意力机制
(Attention Mechanism)
源于对人类视觉的研究。将注意力机制用在计算机视觉任务上,可以有效捕捉图片中有用的区域,从而提升整体网络性能。目前比较常用的有
[
SE block
](
https://arxiv.org/abs/1709.01507
)
、
[
SK-block
](
https://arxiv.org/abs/1903.06586
)
、
[
Non-local block
](
https://arxiv.org/abs/1711.07971
)
、
[
GC block
](
https://arxiv.org/abs/1904.11492
)
、
[
CBAM
](
https://arxiv.org/abs/1807.06521
)
等,核心思想就是去学习特征图在不同区域或者不同通道中的重要性,从而让网络更加注意显著性的区域。
<a
name=
"1.2"
></a>
### 1.2 模型训练相关
...
...
@@ -66,7 +66,7 @@
>>
*
Q: 当前主流的学习率下降策略有哪些?一般需要怎么选择呢?
*
A: 学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是 piecewise_decay,即阶梯式下降学习率,如在 ResNet50 标准的训练中,我们设置的初始学习率是 0.1,每 30 epoch 学习率下降到原来的 1/10,一共迭代 120 epoch。除了 piecewise_decay,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降),cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
*
A: 学习率是通过损失函数的梯度调整网络权重的超参数的速度。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是 piecewise_decay,即阶梯式下降学习率,如在 ResNet50 标准的训练中,我们设置的初始学习率是 0.1,每 30 epoch 学习率下降到原来的 1/10,一共迭代 120 epoch。除了 piecewise_decay,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降),
cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
![](
../../images/models/lr_decay.jpeg
)
>>
*
Q: Warmup 学习率策略是什么?一般用在什么样的场景中?
...
...
@@ -74,7 +74,7 @@
>>
*
Q: 什么是
`batch size`
?在模型训练中,怎么选择合适的
`batch size`
?
*
A:
`batch size`
是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。论文
[
Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
](
https://arxiv.org/abs/1706.02677
)
,当
`batch size`
的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练 ImageNet 数据时,大部分的神经网络选择的初始学习率为 0.1,
`batch size`
是 256,所以根据实际的模型大小和显存情况,可以将学习率设置为 0.1
*k,batch_size 设置为 256*
k。在实际任务中,也可以将该设置作为初始参数,进一步调节学习率参数并获得更优的性能。
*
A:
`batch size`
是训练神经网络中的一个重要的超参数,该值决定了一次将多少数据送入神经网络参与训练。论文
[
Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
](
https://arxiv.org/abs/1706.02677
)
,当
`batch size`
的值与学习率的值呈线性关系时,收敛精度几乎不受影响。在训练 ImageNet 数据时,大部分的神经网络选择的初始学习率为 0.1,
`batch size`
是 256,所以根据实际的模型大小和显存情况,可以将学习率设置为 0.1
*k,
batch_size 设置为 256*
k。在实际任务中,也可以将该设置作为初始参数,进一步调节学习率参数并获得更优的性能。
>>
*
Q: weight_decay 是什么?怎么选择合适的 weight_decay 呢?
*
A: 过拟合是机器学习中常见的一个名词,简单理解即为模型在训练数据上表现很好,但在测试数据上表现较差,在卷积神经网络中,同样存在过拟合的问题,为了避免过拟合,很多正则方式被提出,其中,weight_decay 是其中一个广泛使用的避免过拟合的方式。在使用 SGD 优化器时,weight_decay 等价于在最终的损失函数后添加 L2 正则化,L2 正则化使得网络的权重倾向于选择更小的值,最终整个网络中的参数值更趋向于 0,模型的泛化性能相应提高。在各大深度学习框架的实现中,该值表达的含义是 L2 正则前的系数,在 paddle 框架中,该值的名称是 l2_decay,所以以下都称其为 l2_decay。该系数越大,表示加入的正则越强,模型越趋于欠拟合状态。在训练 ImageNet 的任务中,大多数的网络将该参数值设置为 1e-4,在一些小的网络如 MobileNet 系列网络中,为了避免网络欠拟合,该值设置为 1e-5~4e-5 之间。当然,该值的设置也和具体的数据集有关系,当任务的数据集较大时,网络本身趋向于欠拟合状态,可以将该值适当减小,当任务的数据集较小时,网络本身趋向于过拟合状态,可以将该值适当增大。下表展示了 MobileNetV1_x0_25 在 ImageNet-1k 上使用不同 l2_decay 的精度情况。由于 MobileNetV1_x0_25 是一个比较小的网络,所以 l2_decay 过大会使网络趋向于欠拟合状态,所以在该网络中,相对 1e-4,3e-5 是更好的选择。
...
...
@@ -156,7 +156,7 @@
*
A: 在模型训练完成之后,推荐使用导出的固化模型(inference model),基于 Paddle 预测引擎进行预测,目前支持 python inference 与 cpp inference。如果希望基于服务化部署预测模型,那么推荐使用 PaddleServing 的部署方式。
>>
*
Q: 模型训练完成之后,有哪些比较合适的预测方法进一步提升模型精度呢?
*
A:(1)可以使用更大的预测尺度,比如说训练的时候使用的是 224,那么预测的时候可以考虑使用 288 或者 320,这会直接带来 0.5%左右的精度提升。(2)可以使用测试时增广的策略(Test Time Augmentation, TTA),将测试集通过旋转、翻转、颜色变换等策略,创建多个副本,并分别预测,最后将所有的预测结果进行融合,这可以大大提升预测结果的精度和鲁棒性。(3)当然,也可以使用多模型融合的策略,将多个模型针对相同图片的预测结果进行融合。
*
A:(1)可以使用更大的预测尺度,比如说训练的时候使用的是 224,那么预测的时候可以考虑使用 288 或者 320,这会直接带来 0.5%
左右的精度提升。(2)可以使用测试时增广的策略(Test Time Augmentation, TTA),将测试集通过旋转、翻转、颜色变换等策略,创建多个副本,并分别预测,最后将所有的预测结果进行融合,这可以大大提升预测结果的精度和鲁棒性。(3)当然,也可以使用多模型融合的策略,将多个模型针对相同图片的预测结果进行融合。
>>
*
Q: 多模型融合的时候,该怎么选择合适的模型进行融合呢?
*
A: 在不考虑预测速度的情况下,建议选择精度尽量高的模型;同时建议选择不同结构或者系列的模型进行融合,比如在精度相似的情况下,ResNet50_vd 与 Xception65 的模型融合结果往往比 ResNet50_vd 与 ResNet101_vd 的模型融合结果要好一些。
...
...
@@ -228,7 +228,7 @@ Loss:
*
Q: PaddleClas 提供的 10W 类图像分类预训练模型能否用于模型推断呢?
*
A: 该 10W 类图像分类预训练模型没有提供 fc 全连接层的参数,无法用于模型推断,目前可以用于模型微调。
>>
*
Q: 在使用
`deploy/python/predict_cls.py`
进行模型预测的时候,报了这个问题:
`Error: Pass tensorrt_subgraph_pass has not been registered`
,这是为什么呢?
*
Q: 在使用
`deploy/python/predict_cls.py`
进行模型预测的时候,报了这个问题:
`Error: Pass tensorrt_subgraph_pass has not been registered`
,这是为什么呢?
*
A: 如果希望使用 TensorRT 进行模型预测推理的话,需要安装或是自己编译带 TensorRT 的 PaddlePaddle,Linux、Windows、macOS 系统的用户下载安装可以参考参考
[
下载预测库
](
https://paddleinference.paddlepaddle.org.cn/user_guides/download_lib.html
)
,如果没有符合您所需要的版本,则需要本地编译安装,编译方法可以参考
[
源码编译
](
https://paddleinference.paddlepaddle.org.cn/user_guides/source_compile.html
)
。
>>
*
Q: 怎样在训练的时候使用自动混合精度(Automatic Mixed Precision, AMP)训练呢?
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录