小白学Pytorch系列--Torch.nn API Dropout Layers(11)

小白学Pytorch系列–Torch.nn API Dropout Layers(11)

方法 注释
nn.Dropout 在训练过程中,使用来自伯努利分布的样本,以概率p随机归零输入张量的一些元素。
nn.Dropout1d 随机归零整个通道(一个通道是一个1D特征映射,例如,批处理输入中的第i个样本的第j个通道是一个1D张量 input[i,j]
nn.Dropout2d 随机地将整个通道归零(通道是2D特征图,例如,分批输入中的第i个样本的第j个通道是2D张量input[i,j]。
nn.Dropout3d 随机地将整个通道归零(通道是3D特征图,例如,分批输入中的第i个样本的第j个通道是3D张量input[i,j])。
nn.AlphaDropout 在输入上应用Alpha Dropout。
nn.FeatureAlphaDropout 随机屏蔽整个通道(通道是一个特征映射。

nn.Dropout

在训练过程中,使用来自伯努利分布的样本,以概率p随机归零输入张量的一些元素。每个信道将在每次前转呼叫中独立归零。

这已被证明是一种有效的技术,用于正则化和防止神经元的自适应,如论文所述Improving neural networks by preventing co-adaptation of feature detectors .

>>> m = nn.Dropout(p=0.2)
>>> input = torch.randn(20, 16)
>>> output = m(input)
class SelfDropout(nn.Module):
    def __init__(self, p: float = 0.5, inplace: bool = False) -> None:
        super(SelfDropout, self).__init__()
        if p < 0 or p > 1:
            raise ValueError("dropout probability has to be between 0 and 1, "
                             "but got {}".format(p))
        self.p = p
        self.inplace = inplace
        # 下面是自定义的内容
        # nn.Parameter将变量变成模型的参数,不仅可以参加反向传播的参数更新,还能够在model.cuda()时一同被送到GPU中
        self.dropout_mask = nn.Parameter(torch.zeros(4096))
        self.dropout_mask.requires_grad = True

    # 能够打印用户定制化的额外信息,为重载函数
    def extra_repr(self) -> str:
        return 'p={}, inplace={}'.format(self.p, self.inplace)

    def forward(self, input: Tensor) -> Tensor:
        if self.training:
            print(self.dropout_mask)
            return input * self.dropout_mask
        else:
            return input * self.dropout_mask

nn.Dropout1d

随机地将整个通道归零(通道是1D特征图,例如,分批输入中的第i个样本的第j个通道是一维张量输入[i,j])。使用来自伯努利分布的样本,每个信道将在概率为p的每个前向呼叫上独立地归零。

>>> m = nn.Dropout1d(p=0.2)
>>> input = torch.randn(20, 16, 32)
>>> output = m(input)

nn.Dropout2d

随机地将整个通道归零(通道是1D特征图,例如,分批输入中的第i个样本的第j个通道是一维张量input[i,j])。使用来自伯努利分布的样本,每个信道将在概率为p的每个前向呼叫上独立地归零。

通常输入来自nn.Conv2d模块。

如论文Efficient Object Localization Using Convolutional Networks中所述,如果特征图中的相邻像素是强相关的(就像早期卷积层中的正常情况一样),那么i.i.d.丢弃将不会使激活正则化,否则只会导致有效的学习率降低。

在这种情况下,nn.Dropout2d()将有助于提高特性映射之间的独立性,应该使用它。

>>> m = nn.Dropout2d(p=0.2)
>>> input = torch.randn(20, 16, 32, 32)
>>> output = m(input)

nn.Dropout3d

>>> m = nn.Dropout3d(p=0.2)
>>> input = torch.randn(20, 16, 4, 32, 32)
>>> output = m(input)

nn.AlphaDropout

将Alpha Dropout应用于输入。

Alpha衰减是一种保持自规范化特性的衰减类型。对于具有零平均值和单位标准差的输入,Alpha Dropout的输出保持输入的原始平均值和标准差。Alpha Dropout与SELU激活功能齐头并进,确保输出具有零平均值和单位标准偏差。

在训练过程中,它使用来自伯努利分布的样本,以概率p随机屏蔽输入张量的一些元素。要屏蔽的元素在每次前向调用时都是随机的,并进行缩放和移位以保持零均值和单位标准差。

在评估过程中,模块简单地计算一个身份函数。

更多细节可以在论文 Self-Normalizing Neural Networks .中找到。

>>> m = nn.AlphaDropout(p=0.2)
>>> input = torch.randn(20, 16)
>>> output = m(input)

nn.FeatureAlphaDropout

随机屏蔽整个通道(通道是特征图,例如,批输入中第i个样本的第j个通道是输入张量的张量输入[i,j])。与在常规Dropout中那样将激活设置为零不同,激活被设置为SELU激活函数的负饱和值。更多细节可以在论文Self-Normalizing Neural Networks 中找到。

在每次前向调用中,每个元素将被独立地屏蔽,使用来自伯努利分布的样本,概率为p。在每次前向调用时,将被掩盖的元素随机化,并缩放和移位以保持平均值和单位方差为零。

通常输入来自nn.AlphaDropout模块。

如论文Efficient Object Localization Using Convolutional Networks中所述,如果特征图中的相邻像素是强相关的(就像早期卷积层中的正常情况一样),那么i.i.d.丢弃将不会使激活正则化,否则只会导致有效的学习率降低。

>>> m = nn.FeatureAlphaDropout(p=0.2)
>>> input = torch.randn(20, 16, 4, 32, 32)
>>> output = m(input)

猜你喜欢

转载自blog.csdn.net/weixin_42486623/article/details/129773534
今日推荐