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]]
发布了178 篇原创文章 · 获赞 140 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42146775/article/details/104595624
今日推荐