Dropout解决过拟合代码

学习自《深度学习入门》

过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。

发生过拟合的原因,主要有以下两个。

  • 模型拥有大量参数、表现力强。
  • 训练数据少

权值衰减是一直以来经常被使用的一种抑制过拟合的方法,。该方法可以简单地实现,在某种程度上能够抑制过拟合。但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用Dropout 方法

Dropout是一种在学习的过程中随机删除神经元的方法

训练时,每传递一次数据,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递
测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出
在这里插入图片描述

class Dropout:
 def __init__(self, dropout_ratio=0.5):
   self.dropout_ratio = dropout_ratio
   self.mask = None
 def forward(self, x, train_flg=True):
   if train_flg:
     self.mask = np.random.rand(*x.shape) > self.dropout_ratio
     return x * self.mask
   else:
     return x * (1.0 - self.dropout_ratio)
 def backward(self, dout):
    return dout * self.mask

这里的要点是,每次正向传播时,self.mask中都会以False的形式保存要删除的神经元。self.mask会随机生成和x形状相同的数组,并将值比dropout_ratio大的元素设为True。反向传播时的行为和ReLU相同。也就是说,正向传播时传递了信号的神经元,反向传播时按原样传递信号;正向传播时没有传递信号的神经元,反向传播时信号将停在那


代码解释

a=[[1,2,3],
   [4,5,6]]
dropout_ratio=0.5
print(np.random.rand(*np.array(a).shape))
mask=np.random.rand(*np.array(a).shape)>0.5
print(mask)

>>>
[[0.03797064 0.24113302 0.23486832]
 [0.67104404 0.63273187 0.81895389]]
[[ True False False]
 [False  True  True]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilyil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值