计算机系统应用教程网站

网站首页 > 技术文章 正文

机器学习:在TensorFlow(Keras)中了解和实现Dropout

btikc 2024-10-17 08:40:37 技术文章 7 ℃ 0 评论


在本文中,我们将探讨Dropout的概念,并了解如何使用TensorFlow和Keras在神经网络中实现该技术。

了解Dropout

神经网络在其输入和输出层之间具有隐藏层,这些隐藏层中嵌入了神经元,神经元内的权重以及神经元之间的连接使得神经网络系统能够模拟学习过程。

一般的观点是,神经网络体系结构中的神经元和层越多,其表示能力就越强。表示能力的提高意味着神经网络可以拟合更复杂的函数,并可以更好地泛化到训练数据。

越深的神经网络越容易过度拟合。过度拟合是一个常见问题,它的定义是:模型在训练数据上表现良好,但经过训练的机器学习模型无法很好地泛化到不看见的数据。

Dropout的主要目的是使网络中过度拟合的影响最小化。

Dropout技术是通过随机减少神经网络中相互连接的神经元的数量来实现的。在每一个训练步骤中,每个神经元都有可能被排除在外(从连接的神经元中被剔除)。在某种意义上,层内的神经元学习的权重值不是基于其相邻神经元的协作。

假设你训练了7000个不同的神经网络结构,为了选出最好的一个神经网络体系结构,你只需要取这7000个训练过的神经网络的平均值。

实际上,我们在每个训练步骤中都在训练各种不同的网络(因为在任何两个训练步骤中都不可能排除相同的神经元),因此,使用dropout技术训练的神经网络是在每个训练步骤中的所有不同神经元连接组合的平均值。

实际场景

在实际场景中,或者在测试训练神经网络的性能时,需要考虑以下两点:

1、实际上并不是在神经网络的每个层上都实现了Dropout技术,它通常在神经网络的最后几层被使用。

在CIFAR-10机器学习数据集上进行测试时,如果在最后一个隐藏层中使用了Dropout,则错误率为15.6%。当相同的数据集在相同的卷积神经网络上进行测试(任何一层中均未包含dropout技术)时,错误率为16.6%,相比之下,这是一个进步。

2、评估训练过的神经网络时不会使用Dropout。由于在评估或测试阶段未使用Dropout,因此神经网络可以充分发其潜力,这意味着网络中的所有神经元都处于活动状态,每个神经元的输入连接都比训练时多。

Python实现

1、导入Python库

import tensorflow as tf
from tensorflow import keras

2、加载FashionMNIST机器学习数据集,将图像进行归一化并将数据集拆分为测试集、训练集和验证集。Python代码如下:

(train_images, train_labels),(test_images, test_labels) = keras.datasets.fashion_mnist.load_data()
train_images = train_images /  255.0
test_images = test_images / 255.0
validation_images = train_images[:5000]
validation_labels = train_labels[:5000]

3、创建一个包含dropout层的自定义模型。Python代码如下:

class CustomModel(keras.Model):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.input_layer = keras.layers.Flatten(input_shape=(28,28))
        self.hidden1 = keras.layers.Dense(200, activation='relu')
        self.hidden2 = keras.layers.Dense(100, activation='relu')
        self.hidden3 = keras.layers.Dense(60, activation='relu')
        self.output_layer = keras.layers.Dense(10, activation='softmax')
        self.dropout_layer = keras.layers.Dropout(rate=0.2)
    
    def call(self, input):
        input_layer = self.input_layer(input)
        input_layer = self.dropout_layer(input_layer)
        hidden1 = self.hidden1(input_layer)
        hidden1 = self.dropout_layer(hidden1)
        hidden2 = self.hidden2(hidden1)
        hidden2 = self.dropout_layer(hidden2)
        hidden3 = self.hidden3(hidden2)
        hidden3 = self.dropout_layer(hidden3)
        output_layer = self.output_layer(hidden3)
        return output_layer

4、加载机器学习模型,并初始化优化器和超参数。Python代码如下:

model = CustomModel()
sgd = keras.optimizers.SGD(lr=0.01)
model.compile(loss="sparse_categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])

5、对机器学习模型进行总共60个epochs的训练

model.fit(train_images, train_labels, epochs=60, validation_data=(validation_images, validation_labels))

6、在测试数据集上评估机器学习模型

model.evaluate(test_images, test_labels)

评估结果如下:

10000/10000 [==============================] - 1s 85us/sample - loss: 0.3264 - acc: 0.8822

[0.32644221651554106, 0.8822]

最后

dropout是一种常用的正则化技术,在最先进的计算机视觉任务(如姿态估计、目标检测或语义分割)中也使用了该技术。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表