PyTorch学习笔记:nn.Dropout——随机丢弃层
torch.nn.Dropout(p=0.5, inplace=False)
功能:在训练阶段按某种概率随即将输入的张量元素随机归零,常用的正则化器,用于防止网络过拟合。
输入:
p
:元素归零的概率inplace
:是否改变输入数据,如果设置为True
,则会直接修改输入数据;如果设置为False
,则不对输入数据做修改
注意:
Dropout
操作只在训练阶段执行,即只在训练阶段随机丢弃数据,而对测试阶段的数据不做变化- 如果按概率
p
随机丢弃元素,则输出的元素数值整体上会按比例缩放为原来的 1 − p 1-p 1−p,因此需要相应地将元素放大为 1 1 − p \frac1{1-p} 1−p1倍,即训练过程中,数据首先被放大 1 1 − p \frac1{1-p} 1−p1倍,之后再以概率 p p p执行归零操作,而测试阶段不做变化。
代码案例
一般用法
import torch.nn as nn
import torch
x = torch.arange(10, dtype=torch.float)
# 训练阶段的dropout
drop_train = nn.Dropout(0.2).train()
# 测试阶段的dropout
drop_eval = nn.Dropout(0.2).eval()
y_train = drop_train(x)
y_eval = drop_eval(x)
print('输入:', x)
print('训练阶段的输出:', y_train)
print('测试阶段的输出:', y_eval)
输出
输入: tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
# 数据被放大为原来的1.25倍,即1/0.8倍,之后再随机将数据归零
训练阶段的输出: tensor([ 0.0000, 1.2500, 2.5000, 3.7500, 5.0000, 0.0000, 7.5000, 8.7500, 10.0000, 11.2500])
# 测试阶段不对数据做操作
测试阶段的输出: tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
inplace
设置为True
时,此时相当于先对输入
x
x
x做随机归零,之后再将该数据赋值给
y
y
y,因此经过dropout之后
x
x
x与
y
y
y数值相同
import torch.nn as nn
import torch
x = torch.arange(10, dtype=torch.float)
drop_true = nn.Dropout(0.5, inplace=True)
y = drop_true(x)
print(x)
print(y)
输出
# x变量
tensor([ 0., 2., 4., 0., 0., 10., 0., 0., 0., 18.])
# y变量
tensor([ 0., 2., 4., 0., 0., 10., 0., 0., 0., 18.])
inplace
设置为False
时,经过dropout之后变量
x
x
x不变,
x
x
x与
y
y
y数值不同
import torch.nn as nn
import torch
x = torch.arange(10, dtype=torch.float)
drop_false = nn.Dropout(0.5, inplace=False)
y = drop_false(x)
print(x)
print(y)
输出
# x变量
tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
# y变量
tensor([ 0., 2., 0., 0., 0., 10., 0., 14., 16., 18.])
官方文档
nn.Dropout():https://pytorch.org/docs/stable/generated/torch.nn.Dropout.html#torch.nn.Dropout
初步完稿于2022年1月28日