Keras Tuner documentation

Keras Tuner官方网站的文档 documentation

要求

Python 3.6
TensorFlow 2.0

安装 keras-tuner

pip install -U keras-tuner

或者Install from source:

git clone https://github.com/keras-team/keras-tuner.git
cd keras-tuner
pip install .

using random search.随机搜索

single-layer dense neural network using random search.
用法:基础
这是使用随机搜索为单层密集神经网络执行超参数调整的方法。

首先,我们定义一个模型构建功能。它采用一个参数hp,您可以从该参数中采样超参数,例如hp.Int(‘units’, min_value=32, max_value=512, step=32) (某个范围内的整数)。

此函数返回编译的模型。

from tensorflow import keras
from tensorflow.keras import layers
from kerastuner.tuners import RandomSearch


def build_model(hp):
    model = keras.Sequential()
    model.add(layers.Dense(units=hp.Int('units',
                                        min_value=32,
                                        max_value=512,
                                        step=32),
                           activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    model.compile(
        optimizer=keras.optimizers.Adam(
            hp.Choice('learning_rate',
                      values=[1e-2, 1e-3, 1e-4])),
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'])
    return model

接下来,实例化一个调谐器。您应该指定模型构建功能,要优化的目标的名称(对于内置指标是自动推断出最小化还是最大化),max_trials要测试的试验总数()以及应该建立并适合每个试验(executions_per_trial)。

可用的调谐器为RandomSearch和Hyperband。

注意:每个试验多次执行的目的是减少结果差异,从而能够更准确地评估模型的性能。如果您想更快地获得结果,则可以进行设置executions_per_trial=1(针对每种模型配置进行单轮训练)。

您可以打印搜索空间的摘要:

tuner.search_space_summary()

然后,开始搜索最佳的超参数配置。search的调用和model.fit()具有相同的签名

tuner.search(x, y,
             epochs=5,
             validation_data=(val_x, val_y))

这是在search过程中发生的动作:通过调用模型构建函数model-building function来迭代构建模型,该函数将populates 填充 hp对象跟踪的超参数空间(搜索空间)。调谐器逐步探索空间,记录每种配置的指标。

搜索结束后,您可以检索最佳模型:

models = tuner.get_best_models(num_models=2)

或打印结果摘要:

tuner.results_summary()

您还可以在directory/project_name(例如my_dir/helloworld)文件夹中找到详细的日志,检查点等

搜索空间可能包含条件超参数

下面,我们有一个for循环来创建可调整数量的层,这些层本身包含一个可调整的units参数。

可以将其推到任何级别的参数相互依赖关系,包括递归。

请注意,所有参数名称都应该是唯一的(在这里,在循环中i,我们将内部参数命名为’units_’ + str(i))。

def build_model(hp):
    model = keras.Sequential()
    for i in range(hp.Int('num_layers', 2, 20)):
        model.add(layers.Dense(units=hp.Int('units_' + str(i),
                                            min_value=32,
                                            max_value=512,
                                            step=32),
                               activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    model.compile(
        optimizer=keras.optimizers.Adam(
            hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'])
    return model

使用HyperModel子类而不是模型构建函数

这使得共享和重用超模型变得容易。

一个HyperModel子类只需要实现一个build(self, hp)方法。

from kerastuner import HyperModel


class MyHyperModel(HyperModel):

    def __init__(self, num_classes):
        self.num_classes = num_classes

    def build(self, hp):
        model = keras.Sequential()
        model.add(layers.Dense(units=hp.Int('units',
                                            min_value=32,
                                            max_value=512,
                                            step=32),
                               activation='relu'))
        model.add(layers.Dense(self.num_classes, activation='softmax'))
        model.compile(
            optimizer=keras.optimizers.Adam(
                hp.Choice('learning_rate',
                          values=[1e-2, 1e-3, 1e-4])),
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy'])
        return model


hypermodel = MyHyperModel(num_classes=10)

tuner = RandomSearch(
    hypermodel,
    objective='val_accuracy',
    max_trials=10,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             epochs=5,
             validation_data=(val_x, val_y))

Keras Tuner包含预制的可调应用程序:HyperResNet和HyperXception

这些是用于计算机视觉的即用型超模型。

它们与loss="categorical_crossentropy"和metrics=[“accuracy”]一起预编译。

例如先读取一份数据

# 读取数据
from tensorflow.keras.datasets import cifar10
NUM_CLASSES = 10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# 数据太多跑的太慢,减少数据
x = x_train[:10000]
val_x = x_test[:2000]
y= to_categorical(y_train, NUM_CLASSES)[:10000]
val_y = to_categorical(y_test, NUM_CLASSES)[:2000]

调用预制模型

from kerastuner.applications import HyperResNet
from kerastuner.tuners import Hyperband

hypermodel = HyperResNet(input_shape=(128, 128, 3), num_classes=10)

tuner = Hyperband(
    hypermodel,
    objective='val_accuracy',
    max_trials=40,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             epochs=20,
             validation_data=(val_x, val_y))

仅优化部分参数:将搜索空间限制为仅几个参数

您可以轻松地将搜索空间限制为仅几个参数
如果您已有一个超模型,并且只想搜索几个参数(例如学习率),则可以通过将一个hyperparameters参数传递给调谐器构造函数,并tune_new_entries=False指定您没有使用的参数来进行搜索。清单中的内容hyperparameters不应该调整。对于这些参数,将使用默认值。

from kerastuner import HyperParameters

hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)

hp = HyperParameters()
# This will override the `learning_rate` parameter with your
# own selection of choices
hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])

tuner = Hyperband(
    hypermodel,
    hyperparameters=hp,
    # `tune_new_entries=False` prevents unlisted parameters from being tuned
    tune_new_entries=False,
    objective='val_accuracy',
    max_trials=40,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             epochs=20,
             validation_data=(val_x, val_y))

是否想知道可用的参数名称?阅读代码。

关于参数默认值

每当您在模型构建函数或build超模型的方法中注册超参数时,都可以指定默认值:

hp.Int('units',
       min_value=32,
       max_value=512,
       step=32,
       default=128)

如果您不这样做,则超参数始终具有默认值(对于Int,它等于min_value)。

在超模型中固定某些 值(使其不训练)

如果您想做相反的事情-调整超模型中所有可用参数(除(学习率)以外),该怎么办?fix learning rate 固定学习率

传递hyperparameters带有Fixed条目(或任意数量的Fixed条目)的参数,然后指定tune_new_entries=True。

hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)

hp = HyperParameters()
hp.Fixed('learning_rate', value=1e-4)

tuner = Hyperband(
    hypermodel,
    hyperparameters=hp,
    tune_new_entries=True,
    objective='val_accuracy',
    max_trials=40,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             epochs=20,
             validation_data=(val_x, val_y))

覆盖编译参数

如果您有一个超模型要更改其现有的优化器,损失或度量,则可以通过将以下参数传递给调谐器构造函数来实现:

hypermodel = HyperXception(input_shape=(128, 128, 3), num_classes=10)

tuner = Hyperband(
    hypermodel,
    optimizer=keras.optimizers.Adam(1e-3),
    loss='mse',
    metrics=[keras.metrics.Precision(name='precision'),
             keras.metrics.Recall(name='recall')],
    objective='val_precision',
    max_trials=40,
    directory='my_dir',
    project_name='helloworld')

tuner.search(x, y,
             epochs=20,
             validation_data=(val_x, val_y))

参考

翻译完了,发现,csdn上有大神早已经翻译了,
大家也可移步Keras Tuner自动调参工具使用入门教程
这位大神写的也很好.
总之都是文档上的翻译的东西啦,不过人家一年前就看过了,实在惭愧

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐