0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度学习中的学习率调节实践

454398 来源:alpha007 作者:alpha007 2022-11-16 17:53 次阅读

多层感知器多层感知器(MLP)是由一个输入层、一个或多个隐藏层和一个称为输出层的最终层组成的人工神经网络(ANN)。通常,靠近输入层的层称为较低层,靠近输出层的层称为外层,除输出层外的每一层都包含一个偏置神经元,并与下一层完全相连。当一个 ANN 包含一个很深的隐藏层时,它被称为深度神经网络(DNN)。

在本文中,我们将在 MNIST 数据集上训练一个深度 MLP,并通过指数增长来寻找最佳学习率,绘制损失图,并找到损失增长的点,以达到 85%以上的准确率。对于最佳的实践过程,我们将实现早期停止,保存检查点,并使用 TensorBoard 绘制学习曲线。你可以在这里查看 jupyter Notebook:https://github.com/lukenew2/learning_rates_and_best_practices/blob/master/optimal_learning_rates_with_keras_api.ipynb 指数学习率学习率可以说是最重要的超参数。一般情况下,最佳学习速率约为最大学习速率(即训练算法偏离的学习速率)的一半。找到一个好的学习率的一个方法是训练模型进行几百次迭代,从非常低的学习率(例如,1e-5)开始,逐渐增加到非常大的值(例如,10)。这是通过在每次迭代时将学习速率乘以一个常数因子来实现的。如果你将损失描绘为学习率的函数,你应该首先看到它在下降,但过一段时间后,学习率会变得很高,这时损失会迅速回升:最佳学习率将略低于转折点,然后你可以重新初始化你的模型,并使用此良好的学习率对其进行正常训练。Keras 模型我们先导入相关库 import osimport matplotlib.pyplot as pltimport numpy as npimport pandas as pd

PROJECT_ROOT_DIR = "."IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, "images")os.makedirs(IMAGES_PATH, exist_ok=True)

def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300): path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension) print("Saving figure", fig_id) if tight_layout: plt.tight_layout() plt.savefig(path, format=fig_extension, dpi=resolution)import tensorflow as tffrom tensorflow import keras 接下来加载数据集(X_train, y_train), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()

X_train.shape

X_train.dtype 标准化像素 X_valid, X_train = X_train[:5000] / 255.0, X_train[5000:] / 255.0y_valid, y_train = y_train[:5000], y_train[5000:] X_test = X_test / 255.0 让我们快速看一下数据集中的图像样本,让我们感受一下分类任务的复杂性:class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]

n_rows = 4n_cols = 10plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(X_train[index], cmap="binary", interpolation="nearest") plt.axis('off') plt.title(class_names[y_train[index]], fontsize=12)plt.subplots_adjust(wspace=0.2, hspace=0.5)save_fig('fashion_mnist_plot', tight_layout=False)plt.show()

我们已经准备好用 Keras 来建立我们的 MLP。下面是一个具有两个隐藏层的分类 MLP:model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28,28]), keras.layers.Dense(300, activation="relu"), keras.layers.Dense(100, activation="relu"), keras.layers.Dense(10, activation="softmax")])让我们一行一行地看这个代码:首先,我们创建了一个 Sequential 模型,它是神经网络中最简单的 Keras 模型,它只由一堆按顺序连接的层组成。接下来,我们构建第一层并将其添加到模型中。它是一个 Flatten 层,其目的是将每个输入图像转换成一个 1D 数组:如果它接收到输入数据 X,则计算 X.reshape(-1,1)。由于它是模型的第一层,所以应该指定其输入形状。你也可以添加 keras.layers.InputLayer 作为第一层,设置其 input_shape=[28,28]下一步,我们添加一个 300 个神经元的隐藏层,并指定它使用 ReLU 激活函数。每一个全连接层管理自己的权重矩阵,包含神经元与其输入之间的所有连接权重,同事它还管理一个偏置向量,每个神经元一个。然后我们添加了第二个 100 个神经元的隐藏层,同样使用 ReLU 激活函数。最后,我们使用 softmax 激活函数添加了一个包含 10 个神经元的输出层(因为我们的分类任务是每个类都是互斥的)。使用回调在 Keras 中,fit()方法接受一个回调参数,该参数允许你指定 Keras 在训练开始和结束、每个 epoch 的开始和结束时,甚至在处理每个 batch 处理之前和之后要调用对象的列表。为了实现指数级增长的学习率,我们需要创建自己的自定义回调。我们的回调接受一个参数,用于提高学习率的因子。为了将损失描绘成学习率的函数,我们跟踪每个 batch 的速率和损失。请注意,我们将函数定义为 on_batch_end(),这取决于我们的目标,当然也可以是 on_train_begin(), on_train_end(), on_batch_begin()。对于我们的用例,我们希望在每个批处理之后提高学习率并记录损失:K = keras.backend

class ExponentialLearningRate(keras.callbacks.Callback): def __init__(self, factor): self.factor = factor self.rates = [] self.losses = [] def on_batch_end(self, batch, logs): self.rates.append(K.get_value(self.model.optimizer.lr)) self.losses.append(logs["loss"]) K.set_value(self.model.optimizer.lr, self.model.optimizer.lr * self.factor)现在我们的模型已经创建好了,我们只需调用它的 compile()方法来指定要使用的 loss 函数和优化器,或者你可以指定要在训练和评估期间计算的额外指标列表。首先,我们使用“稀疏的分类交叉熵”损失,因为我们有稀疏的标签(也就是说,对于每个实例,只有一个目标类索引,在我们的例子中,从 0 到 9),并且这些类是互斥的);接下来,我们指定使用随机梯度下降,并将学习速率初始化为 1e-3,并在每次迭代中增加 0.5%:model.compile(loss="sparse_categorical_crossentropy", optimizer=keras.optimizers.SGD(lr=1e-3), metrics=["accuracy"])expon_lr = ExponentialLearningRate(factor=1.005)现在让我们训练模型一个 epoch:history = model.fit(X_train, y_train, epochs=1, validation_data=(X_valid, y_valid), callbacks=[expon_lr])我们现在可以将损失绘制为学习率的函数:plt.plot(expon_lr.rates, expon_lr.losses)plt.gca().set_xscale('log')plt.hlines(min(expon_lr.losses), min(expon_lr.rates), max(expon_lr.rates))plt.axis([min(expon_lr.rates), max(expon_lr.rates), 0, expon_lr.losses[0]])plt.xlabel("Learning rate")plt.ylabel("Loss")save_fig("learning_rate_vs_loss")

正如我们所期望的,随着学习率的提高,最初的损失逐渐减少,但过了一段时间,学习率太大,导致损失反弹:最佳学习率将略低于损失开始攀升的点(通常比转折点低 10 倍左右)。我们现在可以重新初始化我们的模型,并使用良好的学习率对其进行正常训练。还有更多的学习率技巧,包括创建学习进度表,我希望在以后的调查中介绍,但对如何手动选择好的学习率有一个直观的理解同样重要。我们的损失在 3e-1 左右开始反弹,所以让我们尝试使用 2e-1 作为我们的学习率:keras.backend.clear_session()np.random.seed(42)tf.random.set_seed(42)model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation="relu"), keras.layers.Dense(100, activation="relu"), keras.layers.Dense(10, activation="softmax")])model.compile(loss="sparse_categorical_crossentropy", optimizer=keras.optimizers.SGD(lr=2e-1), metrics=["accuracy"])使用 TensorBoard 进行可视化 TensorBoard 是一个很好的交互式可视化工具,你可以使用它查看训练期间的学习曲线、比较学习曲线、可视化计算图、分析训练统计数据、查看模型生成的图像,可视化复杂的多维数据投影到三维和自动聚类,等等!这个工具是在安装 TensorFlow 时自动安装的,所以你应该已经安装了。让我们首先定义将用于 TensorBoard 日志的根日志目录,再加上一个小函数,该函数将根据当前时间生成一个子目录路径,以便每次运行时它都是不同的。你可能需要在日志目录名称中包含额外的信息,例如正在测试的超参数值,以便更容易地了解你在 TensorBoard 中查看的内容:root_logdir = os.path.join(os.curdir, "my_logs")

def get_run_logdir(): import time run_id = time.strftime("run_%Y_%m_%d-%H_%M_%S") return os.path.join(root_logdir, run_id)
run_logdir = get_run_logdir() # 例如, './my_logs/run_2020_07_31-15_15_22'Keras api 提供了一个 TensorBoard()回调函数。TensorBoard()回调函数负责创建日志目录,并在训练时创建事件文件和编写摘要(摘要是一种二进制数据记录,用于创建可视化 TensorBoard)。每次运行有一个目录,每个目录包含一个子目录,分别用于记录训练日志和验证日志,两者都包含事件文件,但训练日志也包含分析跟踪:这使 TensorBoard 能够准确地显示模型在模型的每个部分(跨越所有设备)上花费了多少时间,这对于查找性能瓶颈非常有用。early_stopping_cb = keras.callbacks.EarlyStopping(patience=20)checkpoint_cb = keras.callbacks.ModelCheckpoint("my_fashion_mnist_model.h5", save_best_only=True)tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[early_stopping_cb, checkpoint_cb, tensorboard_cb])接下来,我们需要启动 TensorBoard 服务器。我们可以通过运行以下命令在 Jupyter 中直接执行此操作。第一行加载 TensorBoard 扩展,第二行启动端口 6004 上的 TensorBoard 服务器,并连接到它:%load_ext tensorboard %tensorboard — logdir=./my_logs — port=6004 现在你应该可以看到 TensorBoard 的 web 界面。单击“scaler”选项卡以查看学习曲线。在左下角,选择要可视化的日志(例如,第一次运行的训练日志),然后单击 epoch_loss scaler。请注意,在我们的训练过程中,训练损失下降得很顺利。

你还可以可视化整个图形、学习的权重(投影到 3D)或分析轨迹。TensorBoard()回调函数也有记录额外数据的选项,例如 NLP 数据集的嵌入。这实际上是一个非常有用的可视化工具。结论在这里我们得到了 88%的准确率,这是我们可以达到的最好的深度 MLP。如果我们想进一步提高性能,我们可以尝试卷积神经网络(CNN),它对图像数据非常有效。

就我们的目的而言,这就足够了。我们学会了如何:使用 Keras 的 Sequential API 构建深度 mlp。通过按指数增长学习率,绘制损失图,并找到损失重新出现的点,来找到最佳学习率。构建深度学习模型时的最佳实践,包括使用回调和使用 TensorBoard 可视化学习曲线。如果你想在这里看到 ppt 或 jupyterNotebook 中完整的代码和说明,请随时查看 Github 存储库:https://github.com/lukenew2/learning_rates_and_best_practices。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 深度学习
    +关注

    关注

    73

    文章

    5503

    浏览量

    121157
收藏 人收藏

    评论

    相关推荐

    解析深度学习:卷积神经网络原理与视觉实践

    解析深度学习:卷积神经网络原理与视觉实践
    发表于 06-14 22:21

    什么是深度学习?使用FPGA进行深度学习的好处?

    什么是深度学习为了解释深度学习,有必要了解神经网络。神经网络是一种模拟人脑的神经元和神经网络的计算模型。作为具体示例,让我们考虑一个输入图像并识别图像
    发表于 02-17 16:56

    如何估算深度神经网络的最优学习(附代码教程)

    学习(learning rate)是调整深度神经网络最重要的超参数之一,本文作者Pavel Surmenok描述了一个简单而有效的办法来帮助你找寻合理的学习
    发表于 12-07 11:05 2480次阅读

    机器学习深度学习有什么区别?

    深度学习算法现在是图像处理软件库的组成部分。在他们的帮助下,可以学习和训练复杂的功能;但他们的应用也不是万能的。 “机器学习”和“深度
    的头像 发表于 03-12 16:11 8202次阅读
    机器<b class='flag-5'>学习</b>和<b class='flag-5'>深度</b><b class='flag-5'>学习</b>有什么区别?

    什么是基于深度学习的超分辨

    基于深度学习的超分辨是将学习的上采样(up-sampling)函数应用于图像的过程,目的是增强图像现有的像素数据或生成合理的新像素数据,
    的头像 发表于 05-24 09:33 2772次阅读
    什么是基于<b class='flag-5'>深度</b><b class='flag-5'>学习</b>的超分辨<b class='flag-5'>率</b>

    什么是深度学习优化算法

    先大致讲一下什么是深度学习优化算法吧,我们可以把模型比作函数,一种很复杂的函数:h(f(g(k(x)))),函数有参数,这些参数是未知的,深度学习
    的头像 发表于 02-13 15:31 1615次阅读
    什么是<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>中</b>优化算法

    什么是深度学习算法?深度学习算法的应用

    。 在深度学习,使用了一些快速的算法,比如卷积神经网络以及深度神经网络,这些算法在大量数据处理和图像识别上面有着非常重要的作用。 深度
    的头像 发表于 08-17 16:03 2157次阅读

    深度学习框架pytorch入门与实践

    深度学习框架pytorch入门与实践 深度学习是机器学习
    的头像 发表于 08-17 16:03 1603次阅读

    深度学习框架是什么?深度学习框架有哪些?

    深度学习框架是什么?深度学习框架有哪些?  深度学习框架是一种软件工具,它可以帮助开发者轻松快速
    的头像 发表于 08-17 16:03 2743次阅读

    深度学习框架和深度学习算法教程

    基于神经网络的机器学习方法。 深度学习算法可以分为两大类:监督学习和无监督学习。监督学习的基本任
    的头像 发表于 08-17 16:11 1085次阅读

    深度学习在语音识别的应用及挑战

    一、引言 随着深度学习技术的快速发展,其在语音识别领域的应用也日益广泛。深度学习技术可以有效地提高语音识别的精度和效率,并且被广泛应用于各种应用场景。本文将探讨
    的头像 发表于 10-10 18:14 904次阅读

    GPU在深度学习的应用与优势

    人工智能的飞速发展,深度学习作为其重要分支,正在推动着诸多领域的创新。在这个过程,GPU扮演着不可或缺的角色。就像超级英雄电影的主角一样,GPU在
    的头像 发表于 12-06 08:27 1354次阅读
    GPU在<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>中</b>的应用与优势

    深度学习的无监督学习方法综述

    应用往往难以实现。因此,无监督学习深度学习扮演着越来越重要的角色。本文旨在综述深度
    的头像 发表于 07-09 10:50 729次阅读

    深度学习的时间序列分类方法

    的发展,基于深度学习的TSC方法逐渐展现出其强大的自动特征提取和分类能力。本文将从多个角度对深度学习在时间序列分类的应用进行综述,探讨常用
    的头像 发表于 07-09 15:54 918次阅读

    NPU在深度学习的应用

    设计的硬件加速器,它在深度学习的应用日益广泛。 1. NPU的基本概念 NPU是一种专门针对深度学习算法优化的处理器,它与传统的CPU和G
    的头像 发表于 11-14 15:17 561次阅读