欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dropout解决过拟合代码

程序员文章站 2024-03-15 11:36:05
...

学习自《深度学习入门》

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

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

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

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