torch.nn.modules.dropout 的源代码
from .module import Module
from .. import functional as F
from torch import Tensor
__all__ = ['Dropout', 'Dropout1d', 'Dropout2d', 'Dropout3d', 'AlphaDropout', 'FeatureAlphaDropout']
class _DropoutNd(Module):
__constants__ = ['p', 'inplace']
p: float
inplace: bool
def __init__(self, p: float = 0.5, inplace: bool = False) -> None:
super().__init__()
if p < 0 or p > 1:
raise ValueError(f"dropout probability has to be between 0 and 1, but got {p}")
self.p = p
self.inplace = inplace
def extra_repr(self) -> str:
return f'p={self.p}, inplace={self.inplace}'
[docs]class Dropout(_DropoutNd):
r"""在训练期间,随机将输入张量的一些元素归零,概率为 :attr:`p`。
被归零的元素是独立选择的,每个前向调用都会从伯努利分布中采样。
每个通道将在每次前向调用时独立归零。
这种方法已被证明是一种有效的正则化技术,
并防止神经元的共适应,如论文
`通过防止特征检测器的共适应来改进神经网络`_ 中所述。
此外,训练期间的输出会按因子 :math:`\frac{1}{1-p}` 进行缩放。这意味着在评估期间,模块仅计算一个恒等函数。
参数:
p: 元素被归零的概率。默认值: 0.5
inplace: 如果设置为 ``True``,将就地执行此操作。默认值: ``False``
形状:
- 输入: :math:`(*)`。输入可以是任意形状
- 输出: :math:`(*)`。输出与输入形状相同
示例::
>>> m = nn.Dropout(p=0.2)
>>> input = torch.randn(20, 16)
>>> output = m(input)
.. _通过防止特征检测器的共适应来改进神经网络: https://arxiv.org/abs/1207.0580
"""
def forward(self, input: Tensor) -> Tensor:
return F.dropout(input, self.p, self.training, self.inplace)
[docs]class Dropout1d(_DropoutNd):
r"""随机将整个通道归零。
一个通道是一个1D特征图,
例如,批量输入中第 :math:`i` 个样本的第 :math:`j` 个通道是一个1D张量 :math:`\text{input}[i, j]`。
每个通道将在每次前向调用时独立归零,
概率为 :attr:`p`,使用从伯努利分布中采样的样本。
通常输入来自 :class:`nn.Conv1d` 模块。
如论文
`使用卷积网络进行高效目标定位`_ 中所述,
如果特征图中的相邻像素强烈相关
(通常在早期卷积层中是这种情况),则独立同分布的dropout
将不会正则化激活,否则只会导致有效的学习率下降。
在这种情况下,:func:`nn.Dropout1d` 将有助于促进特征图之间的独立性,
应该使用它。
参数:
p (float, optional): 元素被归零的概率。
inplace (bool, optional): 如果设置为 ``True``,将就地执行此操作
形状:
- 输入: :math:`(N, C, L)` 或 :math:`(C, L)`。
- 输出: :math:`(N, C, L)` 或 :math:`(C, L)`(与输入形状相同)。
示例::
>>> m = nn.Dropout1d(p=0.2)
>>> input = torch.randn(20, 16, 32)
>>> output = m(input)
.. _使用卷积网络进行高效目标定位: https://arxiv.org/abs/1411.4280
"""
def forward(self, input: Tensor) -> Tensor:
return F.dropout1d(input, self.p, self.training, self.inplace)
[docs]class Dropout2d(_DropoutNd):
r"""随机将整个通道归零。
一个通道是一个2D特征图,
例如,批量输入中第 :math:`i` 个样本的第 :math:`j` 个通道是一个2D张量 :math:`\text{input}[i, j]`。
每个通道将在每次前向调用时独立归零,
概率为 :attr:`p`,使用从伯努利分布中采样的样本。
通常输入来自 :class:`nn.Conv2d` 模块。
如论文
`使用卷积网络进行高效目标定位`_ 中所述,
如果特征图中的相邻像素强烈相关
(通常在早期卷积层中是这种情况),则独立同分布的dropout
将不会正则化激活,否则只会导致有效的学习率下降。
在这种情况下,:func:`nn.Dropout2d` 将有助于促进特征图之间的独立性,
应该使用它。
参数:
p (float, optional): 元素被归零的概率。
inplace (bool, optional): 如果设置为 ``True``,将就地执行此操作
.. 警告 ::
由于历史原因,此类将对3D输入执行1D通道方向的dropout
(如 :class:`nn.Dropout1d` 所做的那样)。因此,它目前不支持形状为 :math:`(C, H, W)` 的无批次维度输入。此行为将在未来的版本中更改,以解释3D输入为无批次维度输入。要维护旧行为,请切换到 :class:`nn.Dropout1d`。
形状:
- 输入: :math:`(N, C, H, W)` 或 :math:`(N, C, L)`。
- 输出: :math:`(N, C, H, W)` 或 :math:`(N, C, L)`(与输入形状相同)。
示例::
>>> m = nn.Dropout2d(p=0.2)
>>> input = torch.randn(20, 16, 32, 32)
>>> output = m(input)
.. _使用卷积网络进行高效目标定位: https://arxiv.org/abs/1411.4280
"""
<span class