Tensorflow2.4使用Tuner选择模型最佳超参详解

目录
  • 前言
  • 实现过程
    • 1. 获取 MNIST 数据并进行处理
    • 2. 搭建超模型
    • 3. 实例化调节器并进行模型超调
    • 4. 训练模型获得最佳 epoch
    • 5. 使用最有超参数集进行模型训练和评估

前言

本文使用 cpu 版本的 tensorflow 2.4 ,选用 Keras Tuner 工具以 Fashion 数据集的分类任务为例,完成最优超参数的快速选择任务。

当我们搭建完成深度学习模型结构之后,我们在训练模型的过程中,有很大一部分工作主要是通过验证集评估指标,来不断调节模型的超参数,这是比较耗时耗力的,如果只是不计代价为找到模型最优的超参数组合,我们大可以使用暴力穷举,把所有超参数都搭配组合试用一遍,肯定能找到一组最优的超参数结果。但是现实情况是我们不仅要考虑时间成本,还要考虑计算成本等因素,而 Tuner 工具包可帮助我们省时省力做这件事情,为我们的 TensorFlow 程序选择最佳的超参数集,整个这一找最佳超参数集的过程称为超参数调节或超调。

我们要知道超参数有两种类型:

  • 模型超参:也就是能够影响模型的架构参数,例如神经元个数等
  • 算法超参:也就是能够影响模型学习算法参数,例如学习率和 epoch 等

实现过程

1. 获取 MNIST 数据并进行处理

(1)首先我们要保证 tensorflow 不低于 2.4.0 ,python 不低于 3.8 ,否则无法使用 keras-tuner ,然后使用 pip 安装 keras-tuner 使用即可。

(2)使用 tensorflow 的内置函数从网络获取 Fashion 数据集 。

(3)将整个数据集做归一化操作,加快模型训练的收敛。

import tensorflow as tf
from tensorflow import keras
import keras_tuner as kt
(train_img, train_label), (test_img, test_label) = keras.datasets.fashion_mnist.load_data()
train_img = train_img.astype('float32') / 255.0
test_img = test_img.astype('float32') / 255.0

2. 搭建超模型

(1)这里主要是定义超模型,在构建用于超调的模型时,除了定义模型结构之外,还要定义超参的可选范围,这种为超调搭建的模型称为超模型。

(2)第一层是将每张图片的输入从二维压缩成一维。

(3)第二层是输出一个维度为 units 的全连接层,units 是我们的神经元个数选择器,我们规定了从 16-256 中随机选择一个可用的整数来进行模型的训练,整数选择的步长为 32 ,并最终能确定一个使得模型能达到最好效果的神经元个数,并且使用了激活函数 relu 来进行非线性变换。

(4)第三层是一个输出 10 个维度向量的全连接层,也就是输出该图片属于这 10 个类别的概率分布。

(5)学习率也是一个需要不断调整的超参数,所以我们使用 learning_rate 当做我们优化器学习率的选择器,从 [1e-2, 1e-3, 1e-4] 中选择能使模型达到最好效果的那个。

(6)编译模型的时候我们选择了最常用的 Adam 优化器,其学习率就是用我们刚才定义好的 learning_rate ,一会在模型学习的过程中会不断随机选择一个学习率。

(7)损失函数选择常见的 SparseCategoricalCrossentropy 。

(8)评估指标选择最简单的准确率 accuracy 。

def model_builder(hp):
    model = keras.Sequential()
    model.add(keras.layers.Flatten(input_shape=(28, 28)))
    units = hp.Int('units', min_value=16, max_value=256, step=32)
    model.add(keras.layers.Dense(units=units, activation='relu'))
    model.add(keras.layers.Dense(10))
    learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
    model.compile(optimizer=keras.optimizers.Adam(learning_rate=learning_rate),
                loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])
    return model

3. 实例化调节器并进行模型超调

(1)Tuner 中常见的调节器包括:RandomSearch、Hyperband、BayesianOptimization 和 Sklearn。在本文中我们使用 Hyperband 调节器来完成超参数的选择。

(2)我们知道现实中将所有的超参数进行搭配可以形成很多组,这个组数越多,那么最优超参数组合出现的概率也越大,但是与此相悖的是组数越多,在有限资源的情况下,能对每一组超参数进行测试的资源就越少,找到最优组的概率会下降, Hyperband 由此而生,Hyperband 就是假设尽可能出现多的超参数组,并且每组所能得到的资源要尽可能多,从而确保尽可能找到有最优超参数的那个组。

(3)在实际超调过程中,Hyperband 会假设 n 组超参数组合,然后对这 n 组超参数均匀地分配预算并进行验证评估,根据验证结果淘汰一半表现差的超参数组,不断重复上述过程直到找到一个最优超参数组合。

(4)调用函数 Hyperband 将调节器进行实例化,我们需要传入超模型、训练目标和最大的训练 epoch 。

(5)为了训练过程中防止过拟合现象,我们还加入了 EarlyStopping ,当经过 3 次 epoch 都没有优化之后会停止模型训练。

(6)这里就是使用超调实例 tuner 在模型训练过程中,通过调用 model_builder 函数不断地在 units 、learning_rate 中使用合适的超参构建新模型,并使用训练集为新模型训练 10 个 epoch ,最后选用训练集 20% 比例的验证集,记录下每个配置下的模型在验证集上表现出的评估指标 val_accuracy 。

(7)当超调结束之后,我们返回最好的超参选用结果 best_hps 。

tuner = kt.Hyperband(model_builder, objective='val_accuracy', max_epochs=10)
stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)
tuner.search(train_img, train_label, epochs=10, validation_split=0.2, callbacks=[stop_early])
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
print(f"""超调结束, 第一层全连接层的神经元个数建议选为 {best_hps.get('units')} ,优化器学习率建议选为 {best_hps.get('learning_rate')}.""")

输出结果为:

Trial 30 Complete [00h 00m 15s]
val_accuracy: 0.8845000267028809
Best val_accuracy So Far: 0.8864166736602783
Total elapsed time: 00h 03m 04s
INFO:tensorflow:Oracle triggered exit
超调结束, 第一层全连接层的神经元个数建议选为176 ,优化器学习率建议选为0.001.

4. 训练模型获得最佳 epoch

(1)我们已经通过 tuner 获得了最优的超参数,接下来我们只需要用最优的超参数构建模型,然后使用训练数据对模型进行训练 30 个 epoch 即可,并且使用训练数据的 20% 作为验证集对模型进行效果评估。

(2)我们可以将经过验证集评估得到的每个 epoch 产生的 val_accuracy 都取出来,然后选择其中最大的那个 epoch ,说明当经过 14 次 epoch 就可以达到最佳的模型效果

model = tuner.hypermodel.build(best_hps)
history = model.fit(img_train, label_train, epochs=30, validation_split=0.2)
val_acc_per_epoch = history.history['val_accuracy']
best_epoch = val_acc_per_epoch.index(max(val_acc_per_epoch)) + 1
print('产生最好的 val_accuracy 是在第 %d 个 epoch ' % (best_epoch,))

输出为:

Epoch 1/30
1500/1500 [==============================] - 2s 1ms/step - loss: 0.6338 - accuracy: 0.7770 - val_loss: 0.4494 - val_accuracy: 0.8401
Epoch 2/30
1500/1500 [==============================] - 1s 938us/step - loss: 0.3950 - accuracy: 0.8575 - val_loss: 0.3971 - val_accuracy: 0.8497
...
Epoch 14/30
1500/1500 [==============================] - 2s 1ms/step - loss: 0.2027 - accuracy: 0.9229 - val_loss: 0.3150 - val_accuracy: 0.8943
Epoch 15/30
1500/1500 [==============================] - 1s 985us/step - loss: 0.1951 - accuracy: 0.9280 - val_loss: 0.3200 - val_accuracy: 0.8912
...
Epoch 29/30
1500/1500 [==============================] - 1s 906us/step - loss: 0.1298 - accuracy: 0.9517 - val_loss: 0.3939 - val_accuracy: 0.8902
Epoch 30/30
1500/1500 [==============================] - 1s 951us/step - loss: 0.1194 - accuracy: 0.9561 - val_loss: 0.4027 - val_accuracy: 0.8904
产生最好的 val_accuracy 是在第 14 个 epoch

5. 使用最有超参数集进行模型训练和评估

(1) 经过上面的过程我们已经找到了最好的神经元个数、学习率、以及训练模型的 epoch ,接下来使用这些超参重新实例化新的模型并使用上面的 best_epoch 对其进行训练,仍然选择训练集的 20% 作为验证集对模型效果进行验证 。

best_model = tuner.hypermodel.build(best_hps)
best_model.fit(img_train, label_train, epochs=best_epoch, validation_split=0.2)

(2)我们使用测试集堆模型进行评估。

eval_result = best_model.evaluate(test_img, test_label)
print("测试集损失值 %f , 测试集准确率为 %f"% (eval_result[0], eval_result[1]))

输出结果为:

测试集损失值 0.345943 , 测试集准确率为 0.889400

以上就是Tensorflow2.4使用Tuner选择模型最佳超参详解的详细内容,更多关于Tensorflow2.4 Tuner选择模型的资料请关注我们其它相关文章!

(0)

相关推荐

  • python深度学习tensorflow训练好的模型进行图像分类

    目录 正文 随机找一张图片 读取图片进行分类识别 最后输出 正文 谷歌在大型图像数据库ImageNet上训练好了一个Inception-v3模型,这个模型我们可以直接用来进来图像分类. 下载链接: https://pan.baidu.com/s/1XGfwYer5pIEDkpM3nM6o2A 提取码: hu66 下载完解压后,得到几个文件: 其中 classify_image_graph_def.pb 文件就是训练好的Inception-v3模型. imagenet_synset_to_huma

  • python深度学习tensorflow卷积层示例教程

    目录 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d 二.1.0版本中的卷积函数:tf.layers.conv2d 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d 在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化. conv2d( input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None ) 该函数定义在tensorflow/pytho

  • python深度学习tensorflow1.0参数和特征提取

    目录 tf.trainable_variables()提取训练参数 具体实例 tf.trainable_variables()提取训练参数 在tf中,参与训练的参数可用 tf.trainable_variables()提取出来,如: #取出所有参与训练的参数 params=tf.trainable_variables() print("Trainable variables:------------------------") #循环列出参数 for idx, v in enumera

  • python深度学习tensorflow1.0参数初始化initializer

    目录 正文 所有初始化方法定义 1.tf.constant_initializer() 2.tf.truncated_normal_initializer() 3.tf.random_normal_initializer() 4.random_uniform_initializer = RandomUniform() 5.tf.uniform_unit_scaling_initializer() 6.tf.variance_scaling_initializer() 7.tf.orthogona

  • Tensorflow高性能数据优化增强工具Pipeline使用详解

    目录 安装方法 功能 高级用户部分 用例1,为训练创建数据Pipeline 用例2,为验证创建数据Pipeline 初学者部分 Keras 兼容性 配置 增强: GridMask MixUp RandomErase CutMix Mosaic CutMix , CutOut, MixUp Mosaic Grid Mask 安装方法 给大家介绍一个非常好用的TensorFlow数据pipeline工具. 高性能的Tensorflow Data Pipeline,使用SOTA的增强和底层优化. pi

  • Tensorflow2.1 完成权重或模型的保存和加载

    目录 前言 实现方法 1. 读取数据 2. 搭建深度学习模型 3. 使用回调函数在每个 epoch 后自动保存模型权重 4. 使用回调函数每经过 5 个 epoch 对模型权重保存一次 5. 手动保存模型权重到指定目录 6. 手动保存整个模型结构和权重 前言 本文主要使用 cpu 版本的 tensorflow-2.1 来完成深度学习权重参数/模型的保存和加载操作. 在我们进行项目期间,很多时候都要在模型训练期间.训练结束之后对模型或者模型权重进行保存,然后我们可以从之前停止的地方恢复原模型效果继

  • Tensorflow 2.4加载处理图片的三种方式详解

    目录 前言 数据准备 使用内置函数读取并处理磁盘数据 自定义方式读取和处理磁盘数据 从网络上下载数据 前言 本文通过使用 cpu 版本的 tensorflow 2.4 ,介绍三种方式进行加载和预处理图片数据. 这里我们要确保 tensorflow 在 2.4 版本以上 ,python 在 3.8 版本以上,因为版本太低有些内置函数无法使用,然后要提前安装好 pillow 和 tensorflow_datasets ,方便进行后续的数据加载和处理工作. 由于本文不对模型进行质量保证,只介绍数据的加

  • Tensorflow2.4使用Tuner选择模型最佳超参详解

    目录 前言 实现过程 1. 获取 MNIST 数据并进行处理 2. 搭建超模型 3. 实例化调节器并进行模型超调 4. 训练模型获得最佳 epoch 5. 使用最有超参数集进行模型训练和评估 前言 本文使用 cpu 版本的 tensorflow 2.4 ,选用 Keras Tuner 工具以 Fashion 数据集的分类任务为例,完成最优超参数的快速选择任务. 当我们搭建完成深度学习模型结构之后,我们在训练模型的过程中,有很大一部分工作主要是通过验证集评估指标,来不断调节模型的超参数,这是比较耗

  • react后台系统最佳实践示例详解

    目录 一.中后台系统的技术栈选型 1. 要做什么 2. 要求 3. 技术栈怎么选 二.hooks时代状态管理库的选型 context redux recoil zustand MobX 三.hooks的使用问题与解决方案 总结 一.中后台系统的技术栈选型 本文主要讲三块内容:中后台系统的技术栈选型.hooks时代状态管理库的选型以及hooks的使用问题与解决方案. 1. 要做什么 我们的目标是搭建一个适用于公司内部中后台系统的前端项目最佳实践. 2. 要求 由于业务需求比较多,一名开发人员需要负

  • OpenAI的Whisper模型进行语音识别使用详解

    目录 正文 Whisper 模型介绍 使用Whisper 模型进行语音识别 总结 正文 语音识别是人工智能中的一个领域,它允许计算机理解人类语音并将其转换为文本.该技术用于 Alexa 和各种聊天机器人应用程序等设备.而我们最常见的就是语音转录,语音转录可以语音转换为文字记录或字幕. wav2vec2.Conformer 和 Hubert 等最先进模型的最新发展极大地推动了语音识别领域的发展.这些模型采用无需人工标记数据即可从原始音频中学习的技术,从而使它们能够有效地使用未标记语音的大型数据集.

  • Java 存储模型和共享对象详解

    Java 存储模型和共享对象详解 很多程序员对一个共享变量初始化要注意可见性和安全发布(安全地构建一个对象,并其他线程能正确访问)等问题不是很理解,认为Java是一个屏蔽内存细节的平台,连对象回收都不需要关心,因此谈到可见性和安全发布大多不知所云.其实关键在于对Java存储模型,可见性和安全发布的问题是起源于Java的存储结构. Java存储模型原理 有很多书和文章都讲解过Java存储模型,其中一个图很清晰地说明了其存储结构: 由上图可知, jvm系统中存在一个主内存(Main Memory或J

  • bootstrap中日历范围选择插件daterangepicker的使用详解

    daterangepicker是bootstrap的一个日历插件 主要用来选择时间段的插件 这个插件很好用 也很容易操作  引入相关插件 <!-- 需要引用的依赖库 --> <script type="text/javascript" src="//cdn.jsdelivr.net/jquery/1/jquery.min.js"></script> <script type="text/javascript&quo

  • springmvc处理模型数据ModelAndView过程详解

    这篇文章主要介绍了springmvc处理模型数据ModelAndView过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springmvc提供了以下几种途径来输出模型数据: (1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据. (2)Map及Model:入参为org.springframework.ui.Model.org.springframework.ui.ModelMa

  • python多线程超详细详解

    python中的多线程是一个非常重要的知识点,今天为大家对多线程进行详细的说明,代码中的注释有多线程的知识点还有测试用的实例. import threading from threading import Lock,Thread import time,os ''' python多线程详解 什么是线程? 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位. 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程

  • Java内存模型之happens-before概念详解

    简介 happens-before是JMM的核心概念.理解happens-before是了解JMM的关键. 1.设计意图 JMM的设计需要考虑两个方面,分别是程序员角度和编译器.处理器角度: 程序员角度,希望内存模型易于理解.易于编程.希望是一个强内存模型. 编译器和处理器角度,希望减少对它们的束缚,以至于编译器和处理器可以做更多的性能优化.希望是一个弱内存模型. ​因此JSR-133专家组设计JMM的核心目标就两个: 为程序员提供足够强的内存模型对编译器和处理器的限制尽可能少 ​下面通过一段代

  • C语言基础文件操作方式超全详解建议收藏

    目录 什么是文件 文件名 文件类型 文件指针 文件的打开与关闭 打开方式 文件的顺序读写 关于fread的返回值 对比一组函数 文件随机读取 文件结束判断 perror() ferror() 什么是文件 磁盘上的文件是文件. 在程序设计中,我们一般读的文件有两种:程序文件 和 数据文件 程序文件包括源程序文件(后缀为.c).目标文件(win下后缀为 .obj).可执行文件(win下环境后缀为.exe) 数据文件:文件的内容不一定是程序,而是运行时读写的程序,比如程序运行需要从中读取数据的文件,或

  • Python机器学习应用之基于线性判别模型的分类篇详解

    目录 一.Introduction 1 LDA的优点 2 LDA的缺点 3 LDA在模式识别领域与自然语言处理领域的区别 二.Demo 三.基于LDA 手写数字的分类 四.小结 一.Introduction 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的.这点和PCA不同.PCA是不考虑样本类别输出的无监督降维技术. LDA的思想可以用一句话概括,就是"投影后类内方差最小,类间方

随机推荐