pytorch基础(十)-dropout

文章介绍了Dropout技术在神经网络中的应用,它通过训练时随机置零部分权重来避免对特定权重的依赖,测试时通过调整系数防止过拟合。实验中,即使drop_prob为0.5,输出结果仍接近10000,因为测试时权重乘以了(1-drop_prob)^(-1),解释了为何训练和验证结果保持一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

训练时:通过随机使权重为零的方式使神经元失活

作用:不会产生对某一权重(神经元)的过度依赖

测试时: 所有权重*(1-drop_prob)

nn.Dropout

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值