1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > tensorflow官方Blog-使用Keras Tuner超参数优化框架 进行超参数调整 具体实现版本

tensorflow官方Blog-使用Keras Tuner超参数优化框架 进行超参数调整 具体实现版本

时间:2021-03-31 10:37:08

相关推荐

tensorflow官方Blog-使用Keras Tuner超参数优化框架 进行超参数调整  具体实现版本

文章目录

进入正题,keras tuner超参数优化框架模型构建def build_model(hp):实例化tuner加载数据集,进行超参数搜索tuner.search()找到最佳的模型tuner.get_best_models()上述完整代码贴上:内置可调模型分布式调整:并行(程序并行,GPU并行)搜索自定义训练循环Tuning Scikit-learn Models

/博客上好东西很多,获益匪浅,大家常看常练习

进入正题,keras tuner超参数优化框架

机器学习项目的成功往往是关键取决于良好的超参数的选择。随着机器学习作为一个领域继续成熟,依靠反复试验为这些参数找到合适的值(也称为“梯度下降”)根本无法扩展。实际上,通过复杂的超参数优化算法发现了许多当今的最新结果,例如EfficientNet。

在此,请大佬们拜读efficientnet论文

Keras Tuner是易于使用的可分配超参数优化框架,可解决执行超参数搜索的难题。使用Keras Tuner可以轻松定义搜索空间,并利用随附的算法来找到最佳的超参数值。Keras Tuner内置了贝叶斯优化,超带宽和随机搜索算法,并且还设计为研究人员可以轻松扩展以尝试使用新的搜索算法。

模型构建def build_model(hp):

这是一个简单的端到端示例。首先,我们定义一个模型构建功能。它采用一个hp参数,您可以从该参数中采样超参数,例如hp.Int(‘units’, min_value=32, max_value=512, step=32)(某个范围内的整数)。注意如何用模型构建代码内联定义超参数。下面的示例创建了一个简单的可调模型,我们将在CIFAR-10上进行训练

import tensorflow as tfdef build_model(hp):inputs = tf.keras.Input(shape=(32, 32, 3))x = inputsfor i in range(hp.Int('conv_blocks', 3, 5, default=3)):filters = hp.Int('filters_' + str(i), 32, 256, step=32)for _ in range(2):x = tf.keras.layers.Convolution2D(filters, kernel_size=(3, 3), padding='same')(x)x = tf.keras.layers.BatchNormalization()(x)x = tf.keras.layers.ReLU()(x)if hp.Choice('pooling_' + str(i), ['avg', 'max']) == 'max':x = tf.keras.layers.MaxPool2D()(x)else:x = tf.keras.layers.AvgPool2D()(x)x = tf.keras.layers.GlobalAvgPool2D()(x)x = tf.keras.layers.Dense(hp.Int('hidden_size', 30, 100, step=10, default=50),activation='relu')(x)x = tf.keras.layers.Dropout(hp.Float('dropout', 0, 0.5, step=0.1, default=0.5))(x)outputs = tf.keras.layers.Dense(10, activation='softmax')(x)model = tf.keras.Model(inputs, outputs)pile(optimizer=tf.keras.optimizers.Adam(hp.Float('learning_rate', 1e-4, 1e-2, sampling='log')),loss='sparse_categorical_crossentropy', metrics=['accuracy'])return model

实例化tuner

接下来,实例化一个调谐器tuner。您应该指定模型构建功能,以及要优化的目标的名称(对于内置度量标准,是否自动推断出最小化还是最大化-对于自定义度量标准,您可以通过kerastuner.Objective类进行指定)。在此示例中,Keras调谐器将使用Hyperband算法进行超参数搜索:

每个模型最多训练30个epochs (max_epochs=30),并且将运行“超频带hyperband”算法的两次迭代( hyperband_iterations=2)

import kerastuner as kttuner = kt.Hyperband(build_model,objective='val_accuracy',max_epochs=30,hyperband_iterations=2)

加载数据集,进行超参数搜索tuner.search()

接下来,我们将使用TensorFlow数据集下载CIFAR-10数据集,然后开始超参数搜索。要开始搜索,请调用search方法。此方法具有与以下特征相同的签名keras.Model.fit:

接下来,我们将使用TensorFlow数据集下载CIFAR-10数据集,然后开始超参数搜索。要开始搜索,请调用search方法。此方法具有与以下特征相同的签名keras.Model.fit:

import tensorflow_datasets as tfdsdata = tfds.load('cifar10')train_ds, test_ds = data['train'], data['test']def standardize_record(record):return tf.cast(record['image'], tf.float32) / 255., record['label']train_ds = train_ds.map(standardize_record).cache().batch(64).shuffle(10000)test_ds = test_ds.map(standardize_record).cache().batch(64)tuner.search(train_ds,validation_data=test_ds,epochs=30,callbacks=[tf.keras.callbacks.EarlyStopping(patience=1)])

找到最佳的模型tuner.get_best_models()

每个模型最多训练30个epochs,并且将运行“超频带”算法的两次迭代(tuner = kt.Hyperband()设置了)。之后,您可以使用get_best_models函数来检索在搜索过程中找到的最佳模型:

best_model = tuner.get_best_models(1)[0]

还可以查看通过搜索找到的最佳超参数值:

best_hyperparameters = tuner.get_best_hyperparameters(1)[0]

这就是执行复杂的超参数搜索所需的全部代码!

您可以在此处找到上述示例的完整代码。

上述完整代码贴上:

"""Keras Tuner CIFAR10 example for the TensorFlow blog post."""import tensorflow as tfimport tensorflow_datasets as tfdsimport kerastuner as ktdef build_model(hp):inputs = tf.keras.Input(shape=(32, 32, 3))x = inputsfor i in range(hp.Int("conv_blocks", 3, 5, default=3)):filters = hp.Int("filters_" + str(i), 32, 256, step=32)for _ in range(2):x = tf.keras.layers.Convolution2D(filters, kernel_size=(3, 3), padding="same")(x)x = tf.keras.layers.BatchNormalization()(x)x = tf.keras.layers.ReLU()(x)if hp.Choice("pooling_" + str(i), ["avg", "max"]) == "max":x = tf.keras.layers.MaxPool2D()(x)else:x = tf.keras.layers.AvgPool2D()(x)x = tf.keras.layers.GlobalAvgPool2D()(x)x = tf.keras.layers.Dense(hp.Int("hidden_size", 30, 100, step=10, default=50), activation="relu")(x)x = tf.keras.layers.Dropout(hp.Float("dropout", 0, 0.5, step=0.1, default=0.5))(x)outputs = tf.keras.layers.Dense(10, activation="softmax")(x)model = tf.keras.Model(inputs, outputs)pile(optimizer=tf.keras.optimizers.Adam(hp.Float("learning_rate", 1e-4, 1e-2, sampling="log")),loss="sparse_categorical_crossentropy",metrics=["accuracy"],)return modeltuner = kt.Hyperband(build_model, objective="val_accuracy", max_epochs=30, hyperband_iterations=2)data = tfds.load("cifar10")train_ds, test_ds = data["train"], data["test"]def standardize_record(record):return tf.cast(record["image"], tf.float32) / 255.0, record["label"]train_ds = train_ds.map(standardize_record).cache().batch(64).shuffle(10000)test_ds = test_ds.map(standardize_record).cache().batch(64)tuner.search(train_ds,validation_data=test_ds,callbacks=[tf.keras.callbacks.EarlyStopping(patience=1)],)best_model = tuner.get_best_models(1)[0]best_hyperparameters = tuner.get_best_hyperparameters(1)[0]

内置可调模型

除了允许您定义自己的可调模型外,Keras Tuner还提供了两个内置的可调模型:HyperResnet和HyperXception。这些模型分别搜索ResNet和Xception体系结构的各种排列。这些模型可以这样使用Tuner:

tuner = kt.tuners.BayesianOptimization(kt.applications.HyperResNet(input_shape=(256, 256, 3), classes=10),objective='val_accuracy',max_trials=50)

分布式调整:并行(程序并行,GPU并行)搜索

使用Keras Tuner,您既可以进行数据并行分发,也可以进行试行并行分发。也就是说,您可以用来tf.distribute.Strategy在多个GPU上运行每个模型,还可以在不同的工作程序上并行搜索多个不同的超参数组合。

无需更改代码即可执行试行并行搜索。只需设定KERASTUNER_TUNER_ID,KERASTUNER_ORACLE_IP以及KERASTUNER_ORACLE_PORT环境变量,例如如图在这里bash脚本:

export KERASTUNER_TUNER_ID="chief"export KERASTUNER_ORACLE_IP="127.0.0.1"export KERASTUNER_ORACLE_PORT="8000"python run_my_search.py

调谐器通过中央Oracle服务协调搜索,该服务告诉每个调谐器接下来要尝试的超参数值。有关更多信息,请参见我们的《分布式调整指南》。

自定义训练循环

可以将kerastuner.Tuner类 子类化以支持高级用法,例如:

定制训练循环(GAN,强化学习等)

在模型构建功能之外添加超参数(预处理,数据扩充,测试时间扩充等)

这是一个简单的例子:

class MyTuner(kt.Tuner):def run_trial(self, trial, ...):model = self.hypermodel.build(trial.hyperparameters)score = … # Run the training loop and return the result.self.oracle.update_trial(trial.trial_id, {'score': score})self.oracle.save_model(trial.trial_id, model)

有关更多信息,请参见我们的 Tuner Subclassing 指南。 Tuner Subclassing 指南

Tuning Scikit-learn Models

尽管名称叫keras tuner ,Keras Tuner仍可用于调整各种机器学习模型。除了用于Keras模型的内置Tuner外,Keras Tuner还提供了与Scikit学习模型一起使用的内置Tuner。这是有关如何使用此调谐器的简单示例:

from sklearn import ensemblefrom sklearn import linear_modeldef build_model(hp):model_type = hp.Choice('model_type', ['random_forest', 'ridge'])if model_type == 'random_forest':with hp.conditional_scope('model_type', 'random_forest'):model = ensemble.RandomForestClassifier(n_estimators=hp.Int('n_estimators', 10, 50, step=10),max_depth=hp.Int('max_depth', 3, 10))elif model_type == 'ridge':with hp.conditional_scope('model_type', 'ridge'):model = linear_model.RidgeClassifier(alpha=hp.Float('alpha', 1e-3, 1, sampling='log'))else:raise ValueError('Unrecognized model_type')return modeltuner = kt.tuners.Sklearn(oracle=kt.oracles.BayesianOptimization(objective=kt.Objective('score', 'max'),max_trials=10),hypermodel=build_model,directory=tmp_dir)X, y = ...tuner.search(X, y)

有关Keras Tuner的更多信息,请访问Keras Tuner网站或Keras Tuner GitHub。Keras Tuner是一个完全在GitHub上开发的开源项目。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。