TensorFlow构建模型(超参调优)五

TensorFlow构建模型(超参调优)五,第1张

概要

本文主要讲模型训练过程中的超参数调优(如学习率、神经单元的个数等)。


模型的参数有两类:模型超参数,比如隐藏层的数量和宽度;算法超参数,比如学习率。


我们使用import keras_tuner as kt进行模型的参数调优。


内容

准备我们需要的数据集

import tensorflow as tf
from tensorflow import keras
import keras_tuner as kt
(img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data()
# Normalize pixel values between 0 and 1
img_train = img_train.astype('float32') / 255.0
img_test = img_test.astype('float32') / 255.0

通过先构建一个模型,然后实例化Tuner并执行超参调优。


构建模型的同时定义超参数的搜索空间,我们构建可以调参的模型有两种方法:1、使用模型构建函数(如下代码);2、定义Keras Tuner API的HyperModel类的子类。


def model_builder(hp):
  model = keras.Sequential()
  model.add(keras.layers.Flatten(input_shape=(28, 28)))

  # Tune the number of units in the first Dense layer
  # Choose an optimal value between 32-512
  hp_units = hp.Int('units', min_value=32, max_value=512, step=32)
  model.add(keras.layers.Dense(units=hp_units, activation='relu'))
  model.add(keras.layers.Dense(10))

  # Tune the learning rate for the optimizer
  # Choose an optimal value from 0.01, 0.001, or 0.0001
  hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])

  model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate),
                loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])

  return model

# 实例化Tuner,Keras有4个tuner可用:RandomSearch, Hyperband, BayesianOptimization,Sklearn。


为了能高效的进行调参, tuner = kt.Hyperband(model_builder, objective='val_accuracy', max_epochs=10, factor=3, directory='my_dir', project_name='intro_to_kt') stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5) tuner.search(img_train, label_train, epochs=50, validation_split=0.2, callbacks=[stop_early]) # Get the optimal hyperparameters best_hps=tuner.get_best_hyperparameters(num_trials=1)[0] print(f""" The hyperparameter search is complete. The optimal number of units in the first densely-connected layer is {best_hps.get('units')} and the optimal learning rate for the optimizer is {best_hps.get('learning_rate')}. """) # Build the model with the optimal hyperparameters and train it on the data for 50 epochs model = tuner.hypermodel.build(best_hps) history = model.fit(img_train, label_train, epochs=50, 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('Best epoch: %d' % (best_epoch,)) # Best epoch: 36 hypermodel = tuner.hypermodel.build(best_hps) # Retrain the model hypermodel.fit(img_train, label_train, epochs=best_epoch, validation_split=0.2) eval_result = hypermodel.evaluate(img_test, label_test) print("[test loss, test accuracy]:", eval_result) # [test loss, test accuracy]: [0.49477535486221313, 0.8920000195503235]

更多学习资源:

  1. Keras Tuner on the TensorFlow blog
  2. Keras Tuner website

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存