Python 中的 Dropout 神经网络

介绍

带灯泡的辍学神经网络

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

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 ) 
ac
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Python实现卷积神经网络的基本步骤: 1. 导入必要的库 ```python import numpy as np import tensorflow as tf ``` 2. 设置数据集 ```python # 加载数据集 from tensorflow.keras.datasets import mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 对数据集进行预处理 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 y_train = tf.keras.utils.to_categorical(y_train, 10) y_test = tf.keras.utils.to_categorical(y_test, 10) ``` 3. 构建卷积神经网络模型 ```python model = tf.keras.Sequential() model.add(tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu')) model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) model.add(tf.keras.layers.Dropout(0.25)) model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(128, activation='relu')) model.add(tf.keras.layers.Dropout(0.5)) model.add(tf.keras.layers.Dense(10, activation='softmax')) ``` 4. 编译模型 ```python model.compile(loss=tf.keras.losses.categorical_crossentropy, optimizer=tf.keras.optimizers.Adadelta(), metrics=['accuracy']) ``` 5. 训练模型 ```python model.fit(x_train, y_train, batch_size=128, epochs=12, verbose=1, validation_data=(x_test, y_test)) ``` 6. 评估模型 ```python score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 7. 预测结果 ```python predictions = model.predict(x_test) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值