dropout层
- 要解决的问题:在机器学习的一些模型中,如果模型的参数太多,而训练样本又太少的话,这样训练出来的模型很容易产生过拟合现象。
- 内容:在训练时, 每个神经元以概率p保留, 即以1-p的概率停止工作, 每次前向传播保留下来的神经元都不同。
- 好处:1. 多模型的平均: 不同的固定神经网络会有不同的过拟合, 多个取平均则有可能让一些相反的拟合抵消掉, 而Dropout每次都是不同的神经元失活, 可以看做是多个模型的平均, 类似于多数投票取胜的策略。 2. 减少神经元间的依赖: 由于两个神经元不一定同时有效, 因此减少了特征之间的依赖, 迫使网络学习有更为鲁棒的特征, 因为神经网络不应该对特定的特征敏感, 而应该从众多特征中学习更为共同的规律,这也起到了正则化的效果。 3. 生物进化: Dropout类似于性别在生物进化中的角色, 物种为了适应环境变化, 在繁衍时取雄性和雌性的各一半基因进行组合, 这样可以适应更复杂的新环境, 避免了单一基因的过拟合, 当环境发生变化时也不至于灭绝。
pytorch举例:
# PyTorch将元素置0来实现Dropout层, 第一个参数为置0概率, 第二个为是否原地操作
dropout = nn.Dropout(0.5, inplace=False)
pooling层
- 本质:降采样
- 作用:降低特征图的参数量, 提升计算速度, 增加感受野。可以使模型更关注全局特征而非局部出现的位置。可以保留一些重要的特征信息, 提升容错能力, 并且还能在一定程度上起到防止过拟合的作用 。
- 分类:最大值池化,平均值池化
- 参数:kernel_size, stride
pytorch举例:
max_pooling = nn.MaxPool2d(2, stride=2)
aver_pooling = nn.AvgPool2d(2, stride=2)
BN层
- 要解决的问题: 卷积网络被设计得越来越深, 然而网络却变得难以训练收敛与调参。
- 内容:1. 对每一个batch的输入特征进行白化操作, 即去均值方差过程。
- 进行线性变换操作
γ与β为新引进的可学习参数
- 优点:缓解梯度消失, 加速网络收敛。简化调参, 网络更稳定。防止过拟合。
pytorch使用:
1 import torch
2 from torch import nn
3 # 使用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])
全连接层
- 内容: 每一个节点都与上下层的所有节点相连, 输入与输出都被延展成一维向量
- 缺点:最致命的问题在于其参数量的庞大。存在着大量的参数冗余, 也容易发生过拟合的现象。
参考链接:(神经网络基本组成 - 池化层、Dropout层、BN层、全连接层 13)