作者:手机用户2502932023 | 来源:互联网 | 2023-08-27 14:15
解决神经网络过拟合问题—Dropout方法一、whatisDropout?如何实现?二、使用和不使用Dropout的训练结果对比 一、whatisDropout?如何实现?如果网络
解决神经网络过拟合问题—Dropout方法
- 一、what is Dropout?如何实现?
- 二、使用和不使用Dropout的训练结果对比
一、what is Dropout?如何实现?
如果网络模型复杂,L2范数权值衰减方法就难以对付过拟合。这种情况下,用Dropout方法。
Dropout是一种在学习过程中随机删除神经元的方法。
训练时,随机选出隐藏层神经元,然后将其删除。每传递一次数据,就会随机选择要删除的神经元。
测试时,对各个神经元的输出,要成上训练时的删除比例。
实现代码:
每次正向传播,self.mask以False形式保存要删除的神经元。
self.mask = np.random.rand(*x.shape) > self.dropout_ratio
self.mask随机生成和x形状相同数组,将值大于dropout_ratio元素设为True。
每次反向传播,如果正向传播时候传递了信号的神经元,反向传按原样传,反之不传。
class Dropout:
"""
http://arxiv.org/abs/1207.0580
"""
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
二、使用和不使用Dropout的训练结果对比
从MNIST数据集里只选出来300个数据,然后增加网络复杂幅度用7层网络,每层100个神经元,激活函数ReLU。
下图是使用Dropout的情况
下图是不使用Dropout的情况。
对比得出,使用Dropout,训练数据和测试数据的识别精度的差距变小了,并且训练数据也没有到100%识别。