(比权重衰退效果更好),在数据里面加入随机噪音。dropout是在层之间,加入噪音,
1.【方法如下】
E[x’]=x 保证期望不变,
p的概率下,取值改为0.
其他情况下:改为 x/(1-p)
2.【用法】
对隐藏层的输出h,做dropout,得到h’
常用于多层感知机(全连接层的隐藏层 )的隐藏层输出上,
丢弃概率,是一个超参数
【常用值有: 0.5 0.9 0.1】
3.【dropout只在训练中用】
dropout是一个正则项,正则项只在训练过程中用,正则项只会对权重产生影响,
在预测中,是不需要正则的,是不会用到dropout的,保证确定性的输出
正则项作用:在更新模型权重时, 降低模型复杂度
4.【可重复性如何实现?】
固定随机种子,禁掉cudnn(cudnn出来的结果随机性很大,矩阵求和先后顺序不同,会导致值不同,因为精度会被影响)
import torch
from torch import nn
from d2l import torch as d2l
# assert condition
# 用来让程序测试这个condition,如果condition为false,那么raise一个AssertionError出来
# float()
# 布尔型转换为浮点数
# Float(true)
# 运行结果:1.0
# Float(false)
# 运行结果:0.0
def dropout_layer(X, dropout):
assert 0 <= dropout <= 1
# 在本情况中,所有元素都被丢弃
if dropout == 1:
return torch.zeros_like(X)
# 在本情况中,所有元素都被保留
if dropout == 0:
return X
mask = (torch.randn(X.shape) > dropout).float()
return mask * X / (1.0 - dropout)
# 为社么这里用了乘法*,而不是直接选择呢
# 是因为这样效率更高,对GPU好
X= torch.arange(16, dtype = torch.float32).reshape((2, 8))
print(X)
print(dropout_layer(X, 0.))
print(dropout_layer(X, 0.5))
print(dropout_layer(X, 1.))
# 每次运行的时候调用 随机生成数,使得每次被置为0的是不一样的
# 如果每次是固定的,就等价于把隐藏层大小变小了
RuntimeError: DataLoader worker (pid(s) 9764, 15128) exited unexpectedly
num_workers是加载数据(batch)的线程数目
当加载batch的时间 < 数据训练的时间
GPU每次训练完都可以直接从CPU中取到next batch的数据
无需额外的等待,因此也不需要多余的worker,即使增加worker也不会影响训练速度
当加载batch的时间 > 数据训练的时间
GPU每次训练完都需要等待CPU完成数据的载入
若增加worker,即使worker_1还未就绪,GPU也可以取worker_2的数据来训练
仅限单线程训练情况
https://www.cnblogs.com/longyi8013/p/14880432.html
https://blog.csdn.net/qq_41917697/article/details/114663331
https://www.cnblogs.com/hesse-summer/p/11343870.html