Dropout解决过拟合代码
程序员文章站
2024-03-15 11:36:05
...
学习自《深度学习入门》
过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。
发生过拟合的原因,主要有以下两个。
- 模型拥有大量参数、表现力强。
- 训练数据少
权值衰减是一直以来经常被使用的一种抑制过拟合的方法,。该方法可以简单地实现,在某种程度上能够抑制过拟合。但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用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]]
下一篇: hexo首页文章显示查看原文按钮