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选择模型的资料请关注我们其它相关文章!

时间: 2022-11-16

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

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 ,方便进行后续的数据加载和处理工作. 由于本文不对模型进行质量保证,只介绍数据的加

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

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参数初始化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

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神经网络模型的保存和读取

目录 之前的笔记里实现了softmax回归分类.简单的含有一个隐层的神经网络.卷积神经网络等等,但是这些代码在训练完成之后就直接退出了,并没有将训练得到的模型保存下来方便下次直接使用.为了让训练结果可以复用,需要将训练好的神经网络模型持久化,这就是这篇笔记里要写的东西. TensorFlow提供了一个非常简单的API,即tf.train.Saver类来保存和还原一个神经网络模型. 下面代码给出了保存TensorFlow模型的方法: import tensorflow as tf # 声明两个变量

Python深度学习之Unet 语义分割模型(Keras)

目录 前言 一.什么是语义分割 二.Unet 1.基本原理 2.mini_unet 3. Mobilenet_unet 4.数据加载部分 参考 前言 最近由于在寻找方向上迷失自我,准备了解更多的计算机视觉任务重的模型.看到语义分割任务重Unet一个有意思的模型,我准备来复现一下它. 一.什么是语义分割 语义分割任务,如下图所示: 简而言之,语义分割任务就是将图片中的不同类别,用不同的颜色标记出来,每一个类别使用一种颜色.常用于医学图像,卫星图像任务. 那如何做到将像素点上色呢? 其实语义分割的输

python深度学习tensorflow实例数据下载与读取

目录 一.mnist数据 二.CSV数据 三.cifar10数据 一.mnist数据 深度学习的入门实例,一般就是mnist手写数字分类识别,因此我们应该先下载这个数据集. tensorflow提供一个input_data.py文件,专门用于下载mnist数据,我们直接调用就可以了,代码如下: import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read_data_sets("MNIST_data/&q

Python深度学习TensorFlow神经网络基础概括

目录 一.基础理论 1.TensorFlow 2.TensorFlow过程 1.构建图阶段 2.执行图阶段(会话) 二.TensorFlow实例(执行加法) 1.构造静态图 1-1.创建数据(张量) 1-2.创建操作(节点) 2.会话(执行) API: 普通执行 fetches(多参数执行) feed_dict(参数补充) 总代码 一.基础理论 1.TensorFlow tensor:张量(数据) flow:流动 Tensor-Flow:数据流 2.TensorFlow过程 TensorFlow

python深度学习tensorflow安装调试教程

目录 正文 一.安装anaconda 二.安装tensorflow 三.调试 正文 用过一段时间的caffe后,对caffe有两点感受:1.速度确实快; 2. 太不灵活了. 深度学习技术一直在发展,但是caffe的更新跟不上进度,也许是维护团队的关系:CAFFE团队成员都是业余时间在维护和更新.导致的结果就是很多新的技术在caffe里用不了,比如RNN, LSTM,batch-norm等.当然这些现在也算是旧的东西了,也许caffe已经有了,我已经很久没有关注caffe的新版本了.它的不灵活之处

python深度学习tensorflow入门基础教程示例

目录 正文 1.编辑器 2.常量 3.变量 4.占位符 5.图(graph) 例子1:hello world 例子2:加法和乘法 例子3: 矩阵乘法 正文 TensorFlow用张量这种数据结构来表示所有的数据. 用一阶张量来表示向量,如:v = [1.2, 2.3, 3.5] ,如二阶张量表示矩阵,如:m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],可以看成是方括号嵌套的层数. 1.编辑器 编写tensorflow代码,实际上就是编写py文件,最好找一个好用的编辑器

python深度学习借助多标签分类器进行对抗训练

目录 1 摘要 2 方法介绍 2.1 多分类任务对抗样本 2.2 多标签任务对抗样本 2.3 双分类器对抗训练 人脸表情对抗训练 1 摘要 当前深度模型抵御对抗攻击最有效的方式就是对抗训练,神经网络在训练的过程中通过引入对抗样本使得模型具有一定的鲁棒性.目前对抗训练的研究方向主要集中在多分类任务中的训练方式上,本文尝试借助多标签分类器来对多分类器进行对抗训练,其中多分类任务和多标签任务的区别可以从文章<python深度学习之多标签分类器及pytorch源码>中知晓. 举个例子,一张人脸图片会显

13个最常用的Python深度学习库介绍

如果你对深度学习和卷积神经网络感兴趣,但是并不知道从哪里开始,也不知道使用哪种库,那么这里就为你提供了许多帮助. 在这篇文章里,我详细解读了9个我最喜欢的Python深度学习库. 这个名单并不详尽,它只是我在计算机视觉的职业生涯中使用并在某个时间段发现特别有用的一个库的列表. 这其中的一些库我比别人用的多很多,尤其是Keras.mxnet和sklearn-theano. 其他的一些我是间接的使用,比如Theano和TensorFlow(库包括Keras.deepy和Blocks等). 另外的我只