Python 中的 Dropout 神经网络

本文介绍了 Dropout 技术,一种用于防止神经网络过拟合的方法。通过在训练过程中随机停用部分神经元,网络被迫依赖其他特征,从而增强泛化能力。文章详细解释了 Dropout 的概念,并通过 Python 示例展示了如何修改权重数组以实现 Dropout。
摘要由CSDN通过智能技术生成

介绍

带灯泡的辍学神经网络

术语“丢弃”用于丢弃网络的某些节点的技术。退出可以被视为暂时停用或忽略网络的神经元。该技术应用于训练阶段以减少过拟合效应。过拟合是一种错误,当网络与有限的输入样本集过于接近时会发生这种错误。

dropout 神经网络背后的基本思想是 dropout 节点,以便网络可以专注于其他特征。像这样想。你看了很多你最喜欢的演员的电影。在某些时候你会听广播,这里有人在接受采访。你不认识你最喜欢的演员,因为你只看过电影,而且你是视觉型的。现在,想象一下你只能听电影的音轨。在这种情况下,您必须学会区分女演员和演员的声音。因此,通过删除视觉部分,您将被迫专注于声音功能!

该技术首先在 Nitish Srivastava、Geoffrey Hinton、Alex Krizhevsky、Ilya Sutskever 和 Ruslan Salakhutdinov 于 2014 年在论文“Dropout:一种防止神经网络过度拟合的简单方法”中提出

我们将在 Python 机器学习教程中实现一个能够 dropout 的 Python 类。

修改权重数组

如果我们停用一个节点,我们必须相应地修改权重数组。为了演示如何实现这一点,我们将使用具有三个输入节点、四个隐藏节点和两个输出节点的网络:

具有 3 个输入、4 个隐藏和 2 个输出节点的神经元网络

首先,我们将看看输入和隐藏层之间的权重数组。我们称这个数组为“wih”(输入层和隐藏层之间的权重)。

让我们停用(退出)节点 一世2. 我们可以在下图中看到发生了什么:

具有一个输入丢失节点的神经元网络

这意味着我们必须取出求和的每第二个乘积,这意味着我们必须删除矩阵的整个第二列。输入向量中的第二个元素也必须被删除。

具有丢失输入节点的神经元网络

现在我们将检查如果我们取出一个隐藏节点会发生什么。我们取出第一个隐藏节点,即H1.

具有一个隐藏 dropout 节点的神经元网络

在这种情况下,我们可以删除权重矩阵的完整第一行:

来自神经元网络的权重矩阵,带有丢失的输入节点

取出一个隐藏节点也会影响下一个权重矩阵。让我们看看网络图中发生了什么:

具有一个隐藏 dropout 节点的神经元网络

很容易看出,who 权重矩阵的第一列又要去掉了:

来自神经元网络的权重矩阵,去掉隐藏节点

到目前为止,我们已经任意选择了一个节点来停用。dropout 方法意味着我们从输入层和隐藏层中随机选择一定数量的节点,这些节点保持活动状态并关闭这些层的其他节点。在此之后,我们可以用这个网络训练我们学习集的一部分。下一步包括再次激活所有节点并随机选择其他节点。也可以使用随机创建的 dropout 网络来训练整个训练集。

我们在以下三个图中展示了三种可能的随机选择的 dropout 网络:

在 dropout 网络中随机选择的活动节点,第一个例子

Dropout 网络中随机选择的活动节点,第二个例子

辍学网络中随机选择的活动节点,示例示例

现在是时候考虑可​​能的 Python 实现了。

我们将从输入层和隐藏层之间的权重矩阵开始。我们将为 10 个输入节点和 5 个隐藏节点随机创建一个权重矩阵。我们用 -10 到 10 之间的随机数填充我们的矩阵,这不是正确的权重值,但这样我们可以更好地看到发生了什么:

 numpy 导入 np
导入 随机

input_nodes  =  10 
hidden_​​nodes  =  5 
output_nodes  =  7

wih  =  np 随机的randint ( - 10 ,  10 ,  ( hidden_​​nodes ,  input_nodes )) 
wih

输出:

数组([[ -6, -8, -3, -7, 2, -9, -3, -5, -6, 4],
       [ 5, 3, 7, -4, 4, 8, -2, -4, 7, 7],
       [ 9, -7, 4, 0, 4, 0, -3, -6, -2, 7],
       [ -8, -9, -4, -5, -9, 8, -8, -8, -2, -3],
       [ 3, -10, 0, -3, 4, 0, 0, 2, -7, -9]])

我们现在将为输入层选择活动节点。我们计算活动节点的随机指数:

active_input_percentage  =  0.7 
active_input_nodes  =  int ( input_nodes  *  active_input_percentage ) 
active_input_indices  =  sorted ( random . sample ( range ( 0 ,  input_nodes ),  
                              active_input_nodes )) 
active_input_indices

输出:

[0, 1, 2, 5, 7, 8, 9]

我们在上面了解到我们必须删除列 j,如果节点 一世j已移除。通过对活动节点使用切片运算符,我们可以轻松地为所有非活动节点完成此操作:

wih_old  =  wih copy () 
wih  =  wih [:,  active_input_indices ] 
wih

输出:

数组([[ -6, -8, -3, -9, -5, -6, 4],
       [ 5, 3, 7, 8, -4, 7, 7],
       [ 9, -7, 4, 0, -6, -2, 7],
       [ -8, -9, -4, 8, -8, -2, -3],
       [ 3, -10, 0, 0, 2, -7, -9]])

正如我们之前提到的,我们将不得不修改 'wih' 和 'who' 矩阵:

=  np 随机的randint ( - 10 ,  10 ,  ( output_nodes ,  hidden_​​nodes ))

print ( who ) 
active_hidden_​​percentage  =  0.7 
active_hidden_​​nodes  =  int ( hidden_​​nodes  *  active_hidden_​​percentage ) 
active_hidden_​​indices  
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值