训练时:通过随机使权重为零的方式使神经元失活
作用:不会产生对某一权重(神经元)的过度依赖
测试时: 所有权重*(1-drop_prob)
nn.Dropout(被抛弃的比例)?
放在需要dropout层的前一层
nn.Dropout(drop_prob),
nn.Linear(input_size, outpit_size),
nn.ReLU()
经过dropout后训练集的loss升高,可以有效的防止过拟合??
经过dropout后权重的值减小,有效的防止高方差?
?
class Net(nn.Module):
def __init__(self, neural_num, d_prob=0.5):
super(Net, self).__init__()
self.linears = nn.Sequential(
nn.Dropout(d_prob),
nn.Linear(neural_num, 1, bias=False),
nn.ReLU(inplace=True)
)
def forward(self, x):
return self.linears(x)
input_num = 10000
x = torch.ones((input_num, ), dtype=torch.float32)
net = Net(input_num, d_prob=0.5)
net.linears[1].weight.detach().fill_(1.)
net.train()
y = net(x)
print("output in training mode", y)
net.eval()
y = net(x)
print("output in eval mode", y)
训练集输出的w*x和验证集输出的w*x的值都为10000左右,为什么?
?
?drop_prob为0.5,输出结果应该在5000左右?为什么会在10000左右?
这是因为,为了方便test时的使用
在test时不再执行所有权重*(1-drop_prob)
而是在train时权重*(1/1-p),在test时就不用额外乘以(1-p)
?