文章目录
进入正题,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上开发的开源项目。