首页 > 其他分享 >创建用于预测序列的人工智能模型,用Keras Tuner探索模型的超参数。

创建用于预测序列的人工智能模型,用Keras Tuner探索模型的超参数。

时间:2024-12-28 09:13:28浏览次数:5  
标签:10 keras 模型 Keras 参数 tf Tuner

上一篇:《创建用于预测序列的人工智能模型(五),调整模型的超参数》

序言:在完成初步的模型研发后,接下来的重点是探索和优化超参数。通过合理调整超参数(如学习率、动量参数、神经元数量等),可以进一步提高模型的性能和准确性。这一过程需要结合工具(如 Keras Tuner)进行自动化测试和优化,从而高效找到最优配置方案。

探索使用 Keras Tuner 调整超参数

在上一节中,你学会了如何粗略地优化随机梯度下降(SGD)损失函数的学习率。这确实是一个非常粗略的尝试:每隔几个 epoch 改变一次学习率并测量损失值变化。然而,这种方式受到损失函数本身在每个 epoch 间波动的影响,因此你可能并没有真正找到最佳值,而只是得到了一个近似值。要真正找到最佳值,你需要在每个潜在值的情况下进行完整的轮次训练,然后比较结果。

而且,这还仅仅是针对一个超参数——学习率。如果你还想优化动量参数(momentum),或者调整其他内容,比如每层的神经元数量、层数等,那么可能需要测试成千上万种选项,而手动实现所有这些训练代码几乎是不可能的。

幸运的是,Keras Tuner 工具让这些变得相对简单。你可以通过以下命令安装 Keras Tuner:

!pip install keras-tuner

安装完成后,你就可以使用它来参数化超参数,并指定需要测试的值范围。Keras Tuner 会为每组参数训练模型,评估其性能,并根据你的目标(例如最小化损失)报告最佳的模型结果。我不会在这里详细介绍所有功能,但会展示如何在这个特定模型中使用它。

假设我们想实验两个方面,首先是调整模型架构中输入层的神经元数量。目前的模型架构是输入层 10 个神经元、隐藏层 10 个神经元,然后是输出层。但如果通过增加输入层的神经元数量,网络的表现可以变得更好呢?比如,你可以尝试将输入层的神经元数量从 10 增加到 30。

回忆一下,输入层的定义如下:

tf.keras.layers.Dense(10, input_shape=[window_size], activation="relu")

如果你想测试比硬编码的 10 更大的值,可以这样写:

tf.keras.layers.Dense(units=hp.Int('units', min_value=10, max_value=30, step=2),

activation='relu', input_shape=[window_size])

这里定义了输入层会用多种值进行测试,从 10 开始,每次增加 2,一直到 30。现在,Keras Tuner 将不再只训练一次模型,而是会训练 11 次!

同时,回忆一下优化器中的动量参数是硬编码为 0.9 的:

optimizer = tf.keras.optimizers.SGD(lr=1e-5, momentum=0.9)

你可以使用 hp.Choice 方法测试多个动量值,例如:

optimizer = tf.keras.optimizers.SGD(hp.Choice('momentum', values=[.9, .7, .5, .3]),

lr=1e-5)

这为动量参数提供了 4 种可能的选择。因此,当与前述输入层神经元数量组合时,总共会有 44 种组合需要测试。Keras Tuner 会自动完成这些训练任务,并报告表现最佳的模型。

为了完成设置,首先需要定义一个函数,用于根据超参数构建模型:

def build_model(hp):

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(

units=hp.Int('units', min_value=10, max_value=30, step=2),

activation='relu', input_shape=[window_size]))

model.add(tf.keras.layers.Dense(10, activation='relu'))

model.add(tf.keras.layers.Dense(1))

model.compile(loss="mse",

optimizer=tf.keras.optimizers.SGD(hp.Choice('momentum',

values=[.9, .7, .5, .3]),

lr=1e-5))

return model

接着,使用安装好的 Keras Tuner 创建一个 RandomSearch 对象来管理所有的迭代:

tuner = RandomSearch(

build_model,

objective='loss', max_trials=150,

executions_per_trial=3, directory='my_dir',

project_name='hello')

注意,你需要通过传递前面定义的函数来指定模型。hp 参数用于控制需要调整的值范围。目标(objective)被设置为 loss,表示我们想要最小化损失值。max_trials 参数限制总实验次数,executions_per_trial 参数可以指定每次实验的训练和评估次数,从而减少随机波动的影响。

开始搜索时,只需调用 tuner.search,就像调用 model.fit 一样:

tuner.search(dataset, epochs=100, verbose=0)

运行本章中所使用的合成序列数据后,Keras Tuner 会根据你定义的选项训练模型并完成所有可能的超参数组合测试。

完成后,你可以调用 tuner.results_summary 查看基于目标的前 10 次实验结果:

tuner.results_summary()

你会看到类似以下的输出:

Results summary

|-Results in my_dir/hello

|-Showing 10 best trials

|-Objective(name='loss', direction='min')

Trial summary

|-Trial ID: dcfd832e62daf4d34b729c546120fb14

|-Score: 33.18723194615371

|-Best step: 0

Hyperparameters:

|-momentum: 0.5

|-units: 28

Trial summary

|-Trial ID: 02ca5958ac043f6be8b2e2b5479d1f09

|-Score: 33.83273440510237

|-Best step: 0

Hyperparameters:

|-momentum: 0.7

|-units: 28

从结果中可以看到,最低损失值是在动量为 0.5 和输入神经元数量为 28 时达到的。你可以通过调用 get_best_models 来检索这些模型以及其他最佳模型。例如,如果你想获取前 4 个最佳模型,可以这样调用:

tuner.get_best_models(num_models=4)

你可以测试这些模型,或者使用找到的最佳超参数从头创建一个新模型,例如:

dataset = windowed_dataset(x_train, window_size, batch_size, shuffle_buffer_size)

model = tf.keras.models.Sequential([

tf.keras.layers.Dense(28, input_shape=[window_size], activation="relu"),

tf.keras.layers.Dense(10, activation="relu"),

tf.keras.layers.Dense(1)

])

optimizer = tf.keras.optimizers.SGD(lr=1e-5, momentum=0.5)

model.compile(loss="mse", optimizer=optimizer)

history = model.fit(dataset, epochs=100, verbose=1)

当我使用这些超参数进行训练,并像之前一样对整个验证集进行预测时,我得到了一个类似于图 10-6 的图表:

                                                      图 10-6:优化超参数后的预测图表

对这个模型的 MAE(平均绝对误差)计算结果是 4.47,相比之前的 4.51 有了轻微的改进,相较于上一章统计方法的 5.13 结果更是显著提升。这是在学习率调整为 1e−51e^{-5}1e−5 的情况下完成的,而这个学习率可能还不是最优值。通过 Keras Tuner,你可以进一步调整像这样的超参数,还可以尝试调整中间层的神经元数量,甚至实验不同的损失函数和优化器。尝试一下,看看能否进一步改进这个模型吧!

总结

在本篇中,我们从前几篇的时间序列统计分析出发,尝试将机器学习应用于改进预测。人工智能(机器学习)的核心在于模式匹配,正如预期的那样,我们通过使用深度神经网络(DNN)来发现数据中的模式,成功将平均绝对误差(MAE)降低了近 10%。接着,我们再利用 Keras Tuner 进一步优化超参数,改进了模型的损失值并提升了预测精度。

在接下来的文章中,我们将超越简单的人工智能模型( DNN),探索使用循环神经网络(RNN)来预测序列数据的可能性,并分析其对序列预测的影响。

标签:10,keras,模型,Keras,参数,tf,Tuner
From: https://www.cnblogs.com/jellyai/p/18637050

相关文章

  • 模型 易得性偏差(关键决策)
    系列文章分享 模型,了解更多......
  • 基于BiLSTM和随机森林回归模型的序列数据预测
    本文以新冠疫情相关数据集为案例,进行新冠数量预测。(源码请留言或评论)首先介绍相关理论概念:序列数据特点序列数据是人工智能和机器学习领域的重要研究对象,在多个应用领域展现出独特的特征。这种数据类型的核心特点是元素之间的顺序至关重要,反映了数据内在的时间或空间关联......
  • 2024中国AI大模型场景探索及应用报告,大模型!!!
    随着人工智能技术的飞速发展,AI大模型成为引领行业变革的引擎。2024年,中国AI大模型行业规模已达到147亿元,展现出巨大的潜力和发展空间。行业概况:蓬勃发展的AI大模型AI大模型是指拥有大规模参数的神经网络模型,其训练和应用需要大量算力和高质量数据资源。中国AI大模型行业正......
  • Amazon Bedrock 实践 - 利用 Llama 3.2 模型分析全球糖尿病趋势
    黄浩文资深开发者布道师亚马逊云科技拥有电信、互联网以及云计算等行业超过20年的丰富经验,曾任职于微软、Sun和中国电信。他目前专注于生成式AI、大型语言模型(LLM)、机器学习和数据科学等领域的技术内容创作和实践分享,致力于赋能全球开发者。本博客内容原文来自于作者......
  • MVVM模型
    MVVM模型M:模型(Model),data中的数据V:视图(View),模板代码VM:视图模型(ViewModel):Vue实例化1、data中的所有属性都出现在vm对象身上2、vm身上的所有属性及Vue原型的所有属性,在Vue模板中可以直接使用<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><m......
  • 应用层修复大语言模型(LLMs)输出异常 JSON 通用解决方案
    摘要:在应用集成大语言模型逐步深入的过程中,对于以JSON为代表的结构化数据输出逐步成为核心用例。在模型无法保证100%生成正确JSON输出的当下,应用层是否有一套能够适配多语言,多种结构化格式,同时提供更为健全修复能力的方案?本文结合个人经验,提出了一个基于ANTLR的修复方......
  • 大型语言模型(LLMs)演化树 Large Language Models
    大型语言模型(LLMs)演化树LargeLanguageModelsflyfish下面的图来自论文地址Transformer模型(如BERT和GPT-3)已经给自然语言处理(NLP)领域带来了革命性的变化。这得益于它们具备并行化能力(能够同时对输入数据的多个部分进行计算)、处理长距离依赖关系的能力(可以考虑并理解......
  • 用Python优化生成式AI模型的损失函数
    文章目录一、生成式AI中损失函数的基础1.1什么是损失函数?1.2生成式AI中的损失函数类型二、常见损失函数的优化方法2.1重建损失的优化原理优化方法实践代码2.2对抗损失的优化原理优化方法实践代码2.3KL散度与交叉熵的优化原理优化方法实践代码2.4感知损失的优化......
  • 课程6:自然语言处理(NLP)与大模型
    1.什么是自然语言处理(NLP)?自然语言处理(NaturalLanguageProcessing,简称NLP)是计算机科学和人工智能的一个分支,它旨在让计算机理解、分析和生成人类语言。简单来说,NLP就是教计算机如何“听懂”和“说话”。*NLP的定义:自然语言处理,简称NLP,就像是让计算机理解和“说话”......
  • 搭建一个基于卷积的图像分类的模型
    搭建一个基于卷积的图像分类的模型:注册funHPC的平面,并且完成学生身份认证:网址:https://funhpc.com/#/user/regist?Code=ZnVuLWhwYxvB1gAbnWDFC2hhARSd-3CwCTnB0iN-qp9szH41X0TW使用在读会员区的免费算力:打开线上编程平台(最大限度降低配置环境的压力):导入模型代码(利用c......