先看代码
def dropout_layer(X, dropout):
"""该函数以dropout的概率丢弃张量输入X中的元素 """
assert 0 <= dropout <= 1
# 在本情况中,所有元素都被丢弃。
if dropout == 1:
return torch.zeros_like(X)
# 在本情况中,所有元素都被保留。即不用丢弃
if dropout == 0:
return X
mask = (torch.randn(X.shape) > dropout).float()
# 除以1-p是为了保证期望不变即 E(x) = P*0 + (1-p)*(X/(1-p))
return mask * X / (1.0 - dropout)
x = torch.arange(-1.0, 1.0, 0.1, requires_grad=True)
print('x\n', x)
y = torch.relu(x)
print('y\n', y)
print(dropout_layer(y, 0.5))
输出结果:
x
tensor([-1.0000, -0.9000, -0.8000, -0.7000, -0.6000, -0.5000, -0.4000, -0.3000,
-0.2000, -0.1000, 0.0000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000,
0.6000, 0.7000, 0.8000, 0.9000], requires_grad=True)
y
tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
0.0000, 0.0000, 0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.6000, 0.7000,
0.8000, 0.9000], grad_fn=<ReluBackward0>)
tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
0.0000, 0.0000, 0.0000, 0.0000, 0.6000, 0.8000, 1.0000, 0.0000, 1.4000,
0.0000, 0.0000], grad_fn=<DivBackward0>)