keras_tuner库的总结【源自官网Examples】

article/2025/9/26 16:02:16

keras_tuner库的使用,源自官网的Examples

  1. 在kerastuner中entries表示的是某个超参数对象的可取值。
  2. 术语体系。有些称谓是自行杜撰的。文章中的内容或者概念需要结合原文代码多理解与多实验。
    在这里插入图片描述

① example1

from tensorflow import keras
from tensorflow.keras import layers
from kerastuner.tuners import RandomSearch
from kerastuner.engine.hypermodel import HyperModel
from kerastuner.engine.hyperparameters import HyperParameters(x, y), (val_x, val_y) = keras.datasets.mnist.load_data()
x = x.astype('float32') / 255.
val_x = val_x.astype('float32') / 255.
x = x[:10000]
y = y[:10000]"""Basic case:
- We define a `build_model` function
- It returns a compiled model
- It uses hyperparameters defined on the fly
"""def build_model(hp):model = keras.Sequential()model.add(layers.Flatten(input_shape=(28, 28)))for i in range(hp.Int('num_layers', 2, 20)):model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 32),activation='relu'))model.add(layers.Dense(10, activation='softmax'))model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),loss='sparse_categorical_crossentropy',metrics=['accuracy'])return model# 为微调程序设置必要参数
tuner = RandomSearch(build_model,objective='val_accuracy',max_trials=5,  executions_per_trial=5, directory='test_dir')# tuner.search_space_summary()tuner.search(x=x,y=y,epochs=4,validation_data=(val_x, val_y),batch_size=20)tuner.results_summary()

note:

  1. tunner.search函数的参数使用与keras中model.fit函数的参数一致,其中就包括batch_size(以实现mini_batch的梯度下降算法)
  2. kerastuner.tuners.RandomSearch函数中:max_trials:调参过程中进行实验的参数组合的总数目,executions_per_trial:每个参数组合要重复执行的次数(默认值为1),重点在于,每执行一次,就要执行tuner.search中限定的epochs的次数,换句话说,整个调参过程执行的epoch的次数是:executions_per_trial*epochs。而其价值在于减少结果差异,从而能够更准确地评估模型的性能。但是具体怎么减少的,并不清楚?!
  3. 其实在build_model中,的hp.Inthp.Choice功能一致,都是从一个指定的范围中选择一个值。只不过,前者给定的是区间范围,而后者给定的是离散的值的集合。
  4. 插一句: 因为 调参过程 会默认将每个实验组合对应的模型参数进行ckpt格式的模型存储,且内置了断点续传功能,也就是,当再次运行本程序的时候,如果还没有完成max_trial次实验,会继续进行剩余trial次数的实验,否则,且无results_summary()时,不会进行任何的操作或打印任何信息。
  5. 运用tuner.results_summary()后,如何理解打印的信息
[Results summary]  
[Trial summary]|-Trial ID: ce065e2a0531cf2cb888a4be6bd5f69f|-Score: 0.922279953956604|-Best step: 0> Hyperparameters:
...  ...
[Trial summary]|-Trial ID: ce065e2a0531cf2cb888a4be6bd5f69f|-Score: 0.922279953956604|-Best step: 0> Hyperparameters:
...  ...
[Trial summary]|-Trial ID: ce065e2a0531cf2cb888a4be6bd5f69f|-Score: 0.922279953956604|-Best step: 0> Hyperparameters:
...  ...
  • [Results summary]下的[Trial summary]块的数目会与RandomSearch函数中规定的max_trial的数值一致。且这个[Trial summary]块的内容其实在训练过程中已经在控制台上得到打印(准确的说是在每个trial结束后进行打印,而这一点是系统约定好进行的行为,而非由results_summary或者search_space_summary引起)。只不过在调用tuner.results_summary()时,重新输出了一遍。
  • 重点在于这个Results summary是根据每次trialScore进行倒序排列。因此第一个出现的参数组合是最优的参数组合。
  1. tuner.search_space_summary()的作用是:于正式训练之前会打印出该调参模型中涉及到的所有HyperParameters调参对象(暂且这么称呼)
[Search space summary]|-Default search space size: 4> num_layers (Int)|-default: None|-max_value: 20|-min_value: 2|-sampling: None|-step: 1> units_0 (Int)|-default: None|-max_value: 512|-min_value: 32|-sampling: None|-step: 32> units_1 (Int)|-default: None|-max_value: 512|-min_value: 32|-sampling: None|-step: 32> learning_rate (Choice)|-default: 0.01|-ordered: True|-values: [0.01, 0.001, 0.0001]

如果与下图中的调参对象的名字细心观察,会发现,其实在名字上又对应的。但是之所以units_出现了两次,是因为hp.Int('num_layers', 2, 20)规定了最小值为2 ,也就意味着无论该调参对象取任何一个数值,它都是介于2-20之间,换句话说,model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 32),activation='relu'))该行代码至少运行两次,也就是产生两个全连接层units_0和units_1

② override the loss and metrics

tuner = RandomSearch(build_model,objective='val_accuracy',loss=keras.losses.SparseCategoricalCrossentropy(name='my_loss'),metrics=['accuracy', 'mse'],max_trials=5,directory='test_dir')
#######################3
10000/10000 [==============================] - 2s 159us/sample - loss: 2.3019 - accuracy: 0.1093 - mse: 27.1429 - val_loss: 2.3027 - val_accuracy: 0.1135 - val_mse: 27.2504
  1. 从上面的输出可以看出,当我们衡量的指标是两个或者多个的时候,验证集上的指标名称会前缀val_。另外,注意训练集的metrics是每个batch计算一次,而验证集是每个epoch计算一次。
  2. metrics与loss的计算方式不一样,但都可以用来评价模型的拟合效果。但是后者的另一个重要作用在于反向传播

③ define a HyperModel subclass

其实是对网络结构的进一步封装,并没有技巧上的提升。但是可能会方便之后的优化。

class MyHyperModel(HyperModel):def __init__(self, img_size, num_classes):self.img_size = img_sizeself.num_classes = num_classesdef build(self, hp):model = keras.Sequential()model.add(layers.Flatten(input_shape=self.img_size))for i in range(hp.Int('num_layers', 2, 20)):model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 32),activation='relu'))model.add(layers.Dense(self.num_classes, activation='softmax'))model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),loss='sparse_categorical_crossentropy',metrics=['accuracy'])return modeltuner = RandomSearch(MyHyperModel(img_size=(28, 28), num_classes=10),objective='val_accuracy',max_trials=5,directory='test_dir')

④ restrict the search space(限制搜索空间)

This means that default values are being used for params that are left out
这意味着默认值将用于遗漏的参数.

# 展示第一个例子中的RandomSearch函数与本例的RandomSearch函数
# 一例:
tuner = RandomSearch(build_model,objective='val_accuracy',max_trials=5,  executions_per_trial=1, directory='test_dir')
#本例:
hp = HyperParameters()
hp.Choice('learning_rate', [1e-1, 1e-3])tuner = RandomSearch(build_model,max_trials=5,hyperparameters=hp,tune_new_entries=False,objective='val_accuracy')
  1. 从上面的代码看出,本例的方式可以在外部修改模型中已定义的调参对象的参数取值范围。之所以不在内部修改,可能是为了面向暂时的突发奇想,是一种临时的的,快速实验的处理方式。
  2. HyperParameters()是一个实例Container for both a hyperparameter space, and current values。包含两个属性:一个包含超参对象的实例们的列表以及一个将超参对象实例的名字与current value相映射的字典
  3. tune_new_entries=True如果要False,就必须在代码中定义hp = HyperParameters()以及在RandomSearch中指定出参数hyperparameters=hp
    Whether hyperparameter entries that are requested by the hypermodel but that were not specified in hyperparameters should be added to the search space, or not. If not, then the default value for these parameters will be used.,其中hyperparameter entries that are requested by the hypermodel but that were not specified in hyperparameters中的hyperparameter entries表示模型中已经被定义声明了的超参数对象,但是并没有在hp = HyperParameters()对象中定义的。
    在kerastuner中entries表示的是某个超参数对象的可取值。

一个场景:
我们在模型中定义了需要进行参数调整的一系列超参数对象。本来是可以happy地进行超模型的训练。
但是任何事情的发展过程都会伴随着细节的调整,超模型的训练过程亦然。
当我们想专门调整部分几个超参数对象之间,而并非全部超参数对象之间的参数组合的实验效果。我们如何办呢?

  • 在不添加多余代码的前提下,我们的方式可能是:将暂时不需要参与到实验中的超参数对象修改为非超参数对象,也就是指定一个值。比如optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', [1e-2, 1e-4], default=1e-4)) 修改为 optimizer=keras.optimizers.Adam(1e-4)。这种方法可以达到预期效果,但是比较繁琐,尤其是超参数对象比较多的时候。
  • **推荐的方式:**增加一些代码。如下:
# 1 重新定义一个超参数对象的实例,是个空的。
hp = HyperParameters()
# 2 将目前想要研究的几个超参数对象重新定义。
hp.Int('num_layers', 2,6)
# 3 指定hyperparameters参数,用以替代超模型中相同位置的超参数对象,并设置tune_new_entries=False,以拒绝模型参数中暂时不想被考虑的超参数对象使用定义的默认值(该默认值是在build_model中的定义的default值,如果未指定default参数,则选择参数对象取值范围中的第一个值即first entry)。
tuner = RandomSearch(build_model,hyperparameters=hp,tune_new_entries=False)# 4 当暂时不想被考虑的超参数对象的默认值不是我们想要的那个值时,我们还可以在通过hp.Fixed('learning_rate', 1e-1)来实现。
hp.Fixed('learning_rate', 1e-1)
# 5 当然,如果我们想重写某个超参数对象的范围,超模型中的其他超参数对象仍然可被考虑,也是可以的,不过需要把tune_new_entries设为True。
hp.Int('num_layers', 2,6)
tuner = RandomSearch(build_model,hyperparameters=hp,tune_new_entries=True)

补充:其实tune_new_entries也可以理解为超模型中定义的超参数对象是采用默认值还是values,或者说(min_value, max_value),又或者说choices。True则表示采用后者,而False表示采用前者。
其实到了这一步,原文的第五(关于Fixed)、六(tune_new_entries=True情况下的重写作用)、七个例子(),可以不用讲了,可以详细看上述的代码。

# 部分介绍的完整的代码如下================================:
def build_model(hp):model = keras.Sequential()model.add(layers.Flatten(input_shape=(28, 28)))for i in range(hp.Int('num_layers', 10, 20)):model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 32),activation='relu'))model.add(layers.Dense(10, activation='softmax'))model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', [1e-2, 1e-4], default=1e-4)),loss='sparse_categorical_crossentropy',metrics=['accuracy'])return modelhp = HyperParameters()
hp.Fixed('learning_rate', 1e-1)
hp.Int('num_layers', 2,6)tuner = RandomSearch(build_model,max_trials=5,hyperparameters=hp,tune_new_entries=False,objective='val_accuracy')tuner.search_space_summary()
#################################
[Search space summary]|-Default search space size: 2> learning_rate (Fixed)|-value: 0.1> num_layers (Int)|-default: None|-max_value: 6|-min_value: 2|-sampling: None|-step: 1
  1. hp.Choice中的default需要是values中的一个可取值。如果是可取值以外的值,就会报错。

至此休矣。


http://chatgpt.dhexx.cn/article/JLvfp4tn.shtml

相关文章

射频知识简介

无线通信系统中,一般包含有天线、射频前端、射频收发模块以及基带信号处理器四个部分。随着5G时代的,天线以及射频前端的需求量及价值均快速上升,射频前端是将数字信号向无线射频信号转化的基础部件,也是无线通信系统的核心组件。…

使用PID—tuner做参数整定

环境:Matlab/Simulink 2020a 仿真模型: 调节前:Kp1;Ki0;Kd0 systf([1],[100 80 17 1]); H[1]; kp1;ki0;kd0; PID_CONpid(kp,ki,kd); sys_opsys*PID_CON;sys_clfeedback(sys_op,H) step(sys_cl) 无法跟踪单位阶跃信号 使用Tune整定 虚线是当前…

解决使用pycharm安装keras-tuner后tensorflow-gpu 2.5.0无法使用的问题

解决方法 以下是我的解决方法,亲测可行,不过有点麻烦。 创建新的环境,再次安装tensorflow-gpu 2.5.0,但在之前先安装keras-tuner conda create -n new_tensorflow python3.8进入该环境 conda activate new_tensorflow下载安装cudatoolkit…

MATLAB/simulink中PID Tuner工具箱(APP)

MATLAB学习笔记系列第五篇了,这一篇重点讲一下pid tunner的使用。上一篇讲的是控制系统,MathWorks官方MATLAB/Simulink基础入门视频教程 笔记(控制系统) 那个课程到上一篇就已经完结了,这一篇主要是实际使用过程中的情…

MATLAB中关于PID的调参simulink中PID Tuner工具箱的使用

目录 一、在matlab(r2018a)中导入已知的数学模型 二、打开PID Tuner模型的命令: 三、将数学模型导入到PID Tuner中 使用PID Tuner对simulink里的PID控制器进行调参 已知数学模型为 一、在matlab(r2018a)中…

如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

作者 | 安布奇责编 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文为一篇技术干货,主要讲述在Simulink如何使用PID Tuner进行PID调参。 PID调参器( PIDTuner)概述 1.1 简介 使用PID Tuner可以对Simulink模型中的PID控制器&…

使用Keras Tuner进行自动超参数调优的实用教程

在本文中将介绍如何使用 KerasTuner,并且还会介绍其他教程中没有的一些技巧,例如单独调整每一层中的参数或与优化器一起调整学习率等。Keras-Tuner 是一个可帮助您优化神经网络并找到接近最优的超参数集的工具,它利用了高级搜索和优化方法&am…

AI4DB:openGauss人工智能参数调优之X-Tuner

X-Tuner:参数调优与诊断 一、概述 二、使用准备 三、使用示例 四、获取帮助 五、命令参考 六、常见问题处理 一、概述 增量物化视图可以对物化视图增量刷新,需要用户手动执行语句完成对物化视图在一段时间内的增量数据刷新。与全量创建物化视图的不…

5G时代芯片之王——射频芯片

目录 什么是射频芯片? 射频芯片市场 竞争格局 什么是射频芯片? 射频( RF , Radio Frequency) , 表示可以辐射到空间的电磁频率, 频率范围从300kHz~300GHz之间。射频是一种高频交…

Tuner及工作原理介绍

Tuner的介绍 Tuner是什么? 为了提高电视信号的传输效率,减少于扰,电视信号通常都采用射频(RF)信号传输方式,即把要传输的视频或音频信号调制(作幅度调制AM或频率调制FM)到频率较高的射频载波上,从发信端发送出去&…

ADG架构搭建3 -- 一主一备ADG主备切换

本文接该系列文章的上一篇:ADG架构搭建2 – 搭建一主一备ADG架构 前言 Oracle Dataguard的角色转换包含两类:Switchover和Failover。Switchover指主备之间角色转换,主库降为备库,备库升级为主库。而failover则是指主库出现问题时…

RAC+ADG(单节点ADG)

RACADG有两种存储数据文件的形式,一个是将DG的数据文件放在ASM上,另一个是将数据文件放在本地磁盘上 本实验做的是数据放在本地磁盘上。 在搭建RACDG之前,请确保RAC是没有问题的 1.检查集群状态 grid用户下执行: crsctl status r…

ADG架构搭建1--Oracle安装

本系列文章将会带领大家从零完成一个Oracle ADG架构的搭建。 本片文章为系列文章的第一篇。 前言 本文将带领大家完成两台服务的Oracle安装。 正文 版本说明: Oracle版本 Oracle Database 12c Release 1 (12.1.0.2.0) - Enterprise Edition 操作系统版本 Red Hat …

Oracle ADG 与 DG 的区别

首先,DG(Data Guard,数据卫士)不是一个备份恢复的工具,然而,DG却拥有备份的功能,在物理DG下它可以和主库一模一样,但是它存在的目的并不仅仅是为了备份恢复数据,应该说它…

ADG架构搭建5 -- 一主两备ADG主备切换

本文接该系列文章的上一篇:ADG架构搭建4 – 搭建一主两备ADG架构 前言 在《ADG架构搭建3 – 一主一备ADG主备切换》一文中,已经带领大家完成了一主一备ADG的主备切换,相信大家对该部分内容已有所了解。本文将对《ADG架构搭建4 – 搭建一主两…

第一章 ADG基本知识

Oracle Data Guard 配置可以包含一个主数据库和多达 30 个目标。 备用数据库是主数据库的事务一致副本。 当主数据库是 CDB 时,代理配置中的所有备用数据库也必须是 CDB。 备用数据库的类型如下: 物理备用数据库 提供物理上相同的主数据库副本&#xf…

完成端口使用总结

前言 本文不是全面介绍完成端口的,只是简单介绍了一下完成端口和几个常用概念。本文主要关注完成端口关闭时资源释放问题。 基础介绍 完成端口——可能是Win32下最复杂的一种I/O模型,Win32下最复杂的内核对象。它通过指定数量的线程对重叠I/O请求进行管理,以便为已经完成的…

WinSock完成端口I/O模型

关于重叠I/O,参考《WinSock重叠I/O模型》;关于完成端口的概念及内部机制,参考译文《深度探索I/O完成端口》。 完成端口对象取代了 WSAAsyncSelect 中的消息驱动和 WSAEventSelect 中的事件对象,当然完成端口模型的内部机制要比 WS…

Windows 完成端口编程

Windows 完成端口编程 本文为转载, 原文地址: http://xingzhesun.blogbus.com/logs/3925649.html Table of Contents 1 基本概念 2 OVERLAPPED数据结构 3 完成端口的内部机制 3.1 创建完成端口 3.2 完成端口线程的工作原理 3.3 线程间数据传递 3.4 线程的安全退出 1 基本…

完成端口IOCP详解

本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这篇文档我非常详细并且图文并茂的介绍了…