首页 > 编程知识 正文

线性层和全连接层的区别,组词是什么

时间:2023-05-05 18:21:00 阅读:21413 作者:98

1 .池化层

在卷积网络中,通常在卷积层之间添加池层以降低特征图的参数量、提高计算速度和增加感知区域是一种下采样操作。 池化是强先验的,可以关注全局特征,而不是模型局部出现的位置。 这种降维过程还可以保留一些重要的特征信息,提高容错能力,在一定程度上起到防止过度拟合的作用。

在物体检测中,经常使用最大值池化(Max Pooling )和平均值池化(Average Pooling )。 池化层有两个主要输入参数:内核大小kernel_size和步长大小stride。 图3.7显示了核心大小和步长均为2的最大值池化过程,以左上角为例,9、20、15和26进行最大值池化,保留26。

以下是对池化层的PyTorch的实现。

1导入途径2 fromtorchimportnn 3

4max_pooling=nn.maxpool2d(2,stride=2)5 aver_pooling=nn.AvgPool2d(2) 2,stride=2) 6

7 input=torch.randn (1,1,4,4 ) 8打印) input9tensor ([ 1.2237,-0.8173,- 0.2594,0.1698 ],10 [-0 ] 0

14 #池化主要需要两个参数。 第一个参数表示池化区域的大小,第二个参数表示步长大小

15out_max=max_pooling(input ) 16print ) out _ max 17 tensor ([ 1.2237,0.8561 ],18 [ 0.1622,0.2488 ]。

调用20 #最大值池化和平均值池化时,可以看到size从[1、1、4、4]更改为[1、1、2、2]

1out_aver=aver_pooling(input ) 22print ) out _ aver 23 tensor ([ [ 0.2503,0.0309 ],24 [ 0.0023,0.0525 ]

视图代码

2 .在2. Dropout层深度学习中,如果参数过多而训练样本较少,模型容易出现拟合现象。 过拟合是许多深度学习乃至机械学算法的共同点,具体表现为训练集中预测精度较高,测试集中精度大幅下降。 2012年,Hinton等人提出了一种比较有效地缓解拟合现象发生、起到一定正则化效果的Dropout算法。 Dropout的基本想法如图3.8所示,训练时各神经元以概率p保持,即以1-p的概率停止,每个前向传播保持的神经元不同,从而使模型不太依赖局部特征,可以提高泛化性能测试时,为了保证相同的输出期望值,每个参数乘以p。 当然,还有另一种称为Inverted Dropout的计算方法。 也就是说,训练时剩下的神经元乘以1/p,这样测试时就不需要改变权重。

关于Dropout为什么能够防止过拟合,可以从以下三个方面进行说明。

多模型均值:不同的固定神经网络有不同的过拟合,取多个均值可能抵消一些相反的拟合,但Dropout每次都会使不同的神经元失活,可以视为多个模型的均值

减少神经元之间的依赖:由于两个神经元不一定同时有效,减少了特征之间的依赖,使网络学习具有鲁棒性。 神经网络不应对某些特征敏感,而应从许多特征中学习更多共同规律,这也起到了正则化的作用。

生物进化: Dropout类似于性别在生物进化中的作用。 物种为了适应环境变化,繁殖时采用雄性和雌性各半的基因组合,适应更复杂的新环境,避免单一基因的拟合,即使环境发生变化也不会灭绝。

在PyTorch上使用Dropout很简单。 以下是示例。

importtorchfromtorchimportnn # py torch通过将元素设置为0来实现Dropout层。 第一个参数设置为0概率,第二个参数是是否就地操作

dropout=nn.dropout(0.5,inplace=False ) )。

input=torch.randn (2,64,7,7 ) )。

output=dropout (输入)打印(output.shape ) )。

视图代码

Dropout广泛应用于全连接层,一

般保留概率设置为0.5, 而在较为稀疏的卷积网络中则一般使用下一节将要介绍的BN层来正则化模型, 使得训练更稳定。

3. BN层

为了追求更高的性能, 卷积网络被设计得越来越深, 然而网络却变得难以训练收敛与调参。 原因在于, 浅层参数的微弱变化经过多层线性变换与激活函数后会被放大, 改变了每一层的输入分布, 造成深层的网络需要不断调整以适应这些分布变化, 最终导致模型难以训练收敛。

由于网络中参数变化导致的内部节点数据分布发生变化的现象被称做ICS(Internal Covariate Shift) 。 ICS现象容易使训练过程陷入饱和区, 减慢网络的收敛。 前面提到的ReLU从激活函数的角度出发, 在一定程度上解决了梯度饱和的现象, 而2015年提出的BN层, 则从改变数据分布的角度避免了参数陷入饱

和区。 由于BN层优越的性能, 其已经是当前卷积网络中的“标配”。

BN层首先对每一个batch的输入特征进行白化操作, 即去均值方差过程。 假设一个batch的输入数据为x: B={ x1,…,xm} , 首先求该batch数据的均值与方差, 如式(3-5) 和式(3-6) 所示。

以上公式中, m代表batch的大小, μB为批处理数据的均值, σ2B为批处理数据的方差。 在求得均值方差后, 利用式(3-7) 进行去均值方差操作:

白化操作可以使输入的特征分布具有相同的均值与方差, 固定了每一层的输入分布, 从而加速网络的收敛。 然而, 白化操作虽然从一定程度上避免了梯度饱和, 但也限制了网络中数据的表达能力, 浅层学到的参数信息会被白化操作屏蔽掉, 因此, BN层在白化操作后又增加了一个线性变换操作, 让数据尽可能地恢复本身的表达能力, 如公式(3-7) 和公式(3-8) 所示。

公式(3-8) 中, γ与β为新引进的可学习参数, 最终的输出为yi。

BN层可以看做是增加了线性变换的白化操作, 在实际工程中被证明了能够缓解神经网络难以训练的问题。 BN层的优点主要有以下3点:

·缓解梯度消失, 加速网络收敛。 BN层可以让激活函数的输入数据落在非饱和区, 缓解了梯度消失问题。 此外, 由于每一层数据的均值与方差都在一定范围内, 深层网络不必去不断适应浅层网络输入的变化,实现了层间解耦, 允许每一层独立学习, 也加快了网络的收敛。·简化调参, 网络更稳定。 在调参时, 学习率调得过大容易出现震荡与不收敛, BN层则抑制了参数微小变化随网络加深而被放大的问题, 因此对于参数变化的适应能力更强, 更容易调参。

·防止过拟合。 BN层将每一个batch的均值与方差引入到网络中, 由于每个batch的这两个值都不相同, 可看做为训练过程增加了随机噪音,可以起到一定的正则效果, 防止过拟合。在测试时, 由于是对单个样本进行测试, 没有batch的均值与方差,通常做法是在训练时将每一个batch的均值与方差都保留下来, 在测试时使用所有训练样本均值与方差的平均值。    PyTorch中使用BN层很简单, 示例如下:

1 importtorch2 from torch importnn3 #使用BN层需要传入一个参数为num_features, 即特征的通道数

4 bn = nn.BatchNorm2d(64)5 print(bn)6 >> BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)7

8 #eps为公式中的є, momentum为均值方差的动量, affine为添加可学习参数

9 input = torch.randn(4, 64, 224, 224)10 output =bn(input)11 #BN层不改变输入、 输出的特征大小

12 print(output.shape)13 >> torch.Size([4, 64, 224, 224])

View Code

尽管BN层取得了巨大的成功, 但仍有一定的弊端, 主要体现在以下两点:

·由于是在batch的维度进行归一化, BN层要求较大的batch才能有效地工作, 而物体检测等任务由于占用内存较高, 限制了batch的大小, 这会限制BN层有效地发挥归一化功能。

·数据的batch大小在训练与测试时往往不一样。 在训练时一般采用滑动来计算平均值与方差, 在测试时直接拿训练集的平均值与方差来使用。 这种方式会导致测试集依赖于训练集, 然而有时训练集与测试集的数据分布并不一致。

因此, 我们能不能避开batch来进行归一化呢? 答案是可以的, 最新的工作GN(Group Normalization) 从通道方向计算均值与方差, 使用更为灵活有效, 避开了batch大小对归一化的影响。    具体来讲, GN先将特征图的通道分为很多个组, 对每一个组内的参数做归一化, 而不是batch。 GN之所以能够工作的原因, 笔者认为是在特征图中, 不同的通道代表了不同的意义, 例如形状、 边缘和纹理等, 这些不同的通道并不是完全独立地分布, 而是可以放到一起进行归一化分析。

4. 全连接层全连接层(Fully Connected Layers) 一般连接到卷积网络输出的特征图后边, 特点是每一个节点都与上下层的所有节点相连, 输入与输出都被延展成一维向量, 因此从参数量来看全连接层的参数量是最多的,如图3.9所示。

在物体检测算法中, 卷积网络的主要作用是从局部到整体地提取图像的特征, 而全连接层则用来将卷积抽象出的特征图进一步映射到特定维度的标签空间, 以求取损失或者输出预测结果。

在第2章中的感知机例子即是使用了三层的全连接网络进行分类,PyTorch使用全连接层需要指定输入的与输出的维度。

示例如下:

importtorchfrom torch importnn#第一维表示一共有4个样本

input = torch.randn(4, 1024)

linear= nn.Linear(1024, 4096)

output=linear(input)print(input.shape)>> torch.Size([4, 1024])print(output.shape)>> torch.Size([4, 4096])

View Code

然而, 随着深度学习算法的发展, 全连接层的缺点也逐渐暴露了出来, 最致命的问题在于其参数量的庞大。 在此以VGGNet为例说明, 其第一个全连接层的输入特征为7×7×512=25088个节点, 输出特征是大小为4096的一维向量, 由于输出层的每一个点都来自于上一层所有点的权重相加, 因此这一层的参数量为25088×4096≈108。 相比之下, VGGNet最后一个卷积层的卷积核大小为3×3×512×512≈2.4×106, 全连接层的参数量是这一个卷积层的40多倍。

大量的参数会导致网络模型应用部署困难, 并且其中存在着大量的参数冗余, 也容易发生过拟合的现象。 在很多场景中, 我们可以使用全局平均池化层(Global Average Pooling, GAP) 来取代全连接层, 这种思想最早见于NIN(Network in Network) 网络中, 总体上, 使用GAP有如下3点好处:

·利用池化实现了降维, 极大地减少了网络的参数量。

·将特征提取与分类合二为一, 一定程度上可以防止过拟合。

·由于去除了全连接层, 可以实现任意图像尺度的输入。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。