下面的代码是来自 kera-tuner 网站的相同 Hello-World 示例,但使用 Hyperband 而不是 RandomSearch。
from tensorflow import keras
from tensorflow.keras import layers
from kerastuner.tuners import RandomSearch, Hyperband
from kerastuner.engine.hypermodel import HyperModel
from kerastuner.engine.hyperparameters import HyperParameters
(x, y), (val_x, val_y) = keras.datasets.mnist.load_data()
x = x.astype('float32') / 255.
val_x = val_x.astype('float32') / 255.
x = x[:10000]
y = y[:10000]
def build_model(hp):
model = keras.Sequential()
model.add(layers.Flatten(input_shape=(28, 28)))
for i in range(hp.Int('num_layers', 2, 20)):
model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 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', …
Run Code Online (Sandbox Code Playgroud) 当我运行 Keras Tuner 搜索时,代码会运行一些时期,然后显示:“INFO:tensorflow:Oracle 触发退出”。
这是什么意思?我仍然能够提取最佳的超参数。是因为提早停止吗?我尝试过随机搜索和超频带。
我想使用 kerastuner 框架进行超参数训练。
我如何选择优化器以及可以传递给优化器的不同学习率。这是我的model.compile()
方法。
model.compile(
loss=BinaryCrossentropy(from_logits=True),
optimizer=hp.Choice('optimizer', values=['adam', 'adagrad', 'SGD']),
metrics=['accuracy']
)
Run Code Online (Sandbox Code Playgroud)
该代码一次仅选择一个优化器,并使用默认的学习率。我想将学习率传递hp.Float('lrate', min_value=1e-4, max_value=1e-2, sampling='LOG')
给每个优化器。我怎样才能嵌套它们。
machine-learning neural-network hyperparameters tensorflow keras-tuner
根据此处和此处的 Keras Tuner 示例,如果您想使用超参数定义深度学习模型中的层数和每层单元,您可以执行以下操作:
for i in range(hp.Int('num_layers', 1, 10)):
model.add(layers.Dense(units=hp.Int('unit_' + str(i), 32, 512, 32)))
Run Code Online (Sandbox Code Playgroud)
然而,正如其他人在这里和这里指出的那样,在预言机看到一个模型之后,num_layers = 10
它总是会为unit_0
through分配一个值unit_9
,即使num_layers
小于 10 也是如此。
num_layers = 1
例如,在这种情况下,仅unit_0
将用于构建模型。但是,unit_1
通过unit_9
将在超参数中定义并激活。
预言机是否“知道” unit_1
throughunit_9
实际上并未用于构建模型(因此忽略它们与影响试验结果的相关性)?
或者,它是否假设正在使用unit_1
through ,因为它们已被定义(并且调用例如将返回一个值)?unit_9
hp.get('unit_9')
在后一种情况下,预言机使用错误信息来驱动调整过程。因此,(最好的情况下)需要更长的时间才能收敛,并且由于将相关性分配给未使用的超参数(最坏的情况下),因此会错误地收敛到解决方案。
模型实际上应该像这样使用条件范围来定义吗?
num_layers = hp.Int('num_layers', 1, 10)
for i in range(num_layers):
with hp.conditional_scope('num_layers', list(range(i …
Run Code Online (Sandbox Code Playgroud) 我正在尝试第一次获得一个 keras-tuner 调整的深度学习模型。我的调整代码如下:
def build_model_test(hp):
model = models.Sequential()
model.add(layers.InputLayer(input_shape=(100,28)))
model.add(layers.Dense(28,activation = 'relu'))
model.add(BatchNormalization(momentum = 0.99))
model.add(Dropout(hp.Float('dropout', 0, 0.5, step=0.1, default=0.5)))
model.add(layers.Conv1D(filters=hp.Int(
'num_filters',
16, 128,
step=16
),kernel_size=3,strides=1,padding='same',activation='relu'))
model.add(BatchNormalization(momentum = 0.99))
model.add(Dropout(hp.Float('dropout', 0, 0.5, step=0.1, default=0.5)))
model.add(layers.Conv1D(filters=hp.Int(
'num_filters',
16, 128,
step=16
),kernel_size=3,strides=1,padding='same',activation='relu'))
model.add(BatchNormalization(momentum = 0.99))
model.add(Dropout(hp.Float('dropout', 0, 0.5, step=0.1, default=0.5)))
model.add(layers.Conv1D(filters=hp.Int(
'num_filters',
16, 128,
step=16
),kernel_size=3,strides=1,padding='same',activation='relu'))
model.add(BatchNormalization(momentum = 0.99))
model.add(Dropout(hp.Float('dropout', 0, 0.5, step=0.1, default=0.5)))
model.add(layers.Dense(units=hp.Int('units',min_value=16,max_value=512,step=32,default=128),activation = 'relu'))
model.add(Dropout(hp.Float('dropout', 0, 0.5, step=0.1, default=0.5)))
model.add(layers.Dense(1, activation = 'linear'))
model.compile(
optimizer='adam',
loss=['mean_squared_error'],
metrics=[tf.keras.metrics.RootMeanSquaredError()]
)
return …
Run Code Online (Sandbox Code Playgroud) 使用 Keras Tuner 时,似乎没有办法允许跳过有问题的超参数组合。例如,Conv1D 层中的过滤器数量可能与后续 MaxPooling1D 层中的池大小的所有值不兼容,从而导致模型构建错误。然而,在运行调谐器之前可能不知道这一点。一旦调谐器运行,这将导致一个错误,从而终止整个调谐过程。有没有办法跳过任何导致错误的超参数组合?
示例代码:
def model_builder(hp):
model = Sequential()
model.add(
Embedding(
input_dim=hp.Int(
'vocab_size',
min_value=4000,
max_value=10000,
step=1000,
default=4000
),
output_dim=hp.Choice(
'embedding_dim',
values=[32, 64, 128, 256],
default=32
),
input_length=hp.Int(
'max_length',
min_value=50,
max_value=200,
step=10,
default=50
)
)
)
model.add(
Conv1D(
filters=hp.Choice(
'num_filters_1',
values=[32, 64],
default=32
),
kernel_size=hp.Choice(
'kernel_size_1',
values=[3, 5, 7, 9],
default=7
),
activation='relu'
)
)
model.add(
MaxPooling1D(
pool_size=hp.Choice(
'pool_size',
values=[3, 5],
default=5
)
)
)
model.add(
Conv1D(
filters=hp.Choice(
'num_filters_2',
values=[32, 64],
default=32
),
kernel_size=hp.Choice(
'kernel_size_2',
values=[3, 5, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在之后重新加载或访问Keras-Tuner Trials
Tuner
以检查结果。我无法找到与此问题相关的任何文档或答案。
例如,我设置BayesianOptimization
搜索最佳超参数如下:
## Build Hyper Parameter Search
tuner = kt.BayesianOptimization(build_model,
objective='val_categorical_accuracy',
max_trials=10,
directory='kt_dir',
project_name='lstm_dense_bo')
tuner.search((X_train_seq, X_train_num), y_train_cat,
epochs=30,
batch_size=64,
validation_data=((X_val_seq, X_val_num), y_val_cat),
callbacks=[callbacks.EarlyStopping(monitor='val_loss', patience=3,
restore_best_weights=True)])
Run Code Online (Sandbox Code Playgroud)
kt_dir
我看到这会在项目名称的目录中创建试用文件,lstm_dense_bo
如下所示:
现在,如果我重新启动 Jupyter 内核,如何将这些试验重新加载到Tuner
对象中,然后检查最佳模型或最佳超参数或最佳试验?
我非常感谢你的帮助。谢谢
我正在尝试使用 KerasTuner 自动调整神经网络架构,即隐藏层的数量和每个隐藏层中的节点数量。目前,神经网络架构是使用一个参数 来定义的NN_LAYER_SIZES
。例如,
NN_LAYER_SIZES = [128, 128, 128, 128]
Run Code Online (Sandbox Code Playgroud)
表示神经网络有 4 个隐藏层,每个隐藏层有 128 个节点。
KerasTuner 具有以下超参数类型(https://keras.io/api/keras_tuner/hyperparameters/):
似乎这些超参数类型都不适合我的用例。所以我写了下面的代码来扫描隐藏层数和节点数。然而,它并没有被认为是一个超参数。
number_of_hidden_layer = hp.Int("layer_number", min_value=2, max_value=5, step=1)
number_of_nodes = hp.Int("node_number", min_value=4, max_value=8, step=1)
NN_LAYER_SIZES = [2**number_of_nodes for _ in range(number of hidden_layer)]
Run Code Online (Sandbox Code Playgroud)
关于如何使其正确的任何建议?
有什么方法可以将最佳超参数作为列表返回,以便我可以在代码的其他部分访问?我不需要整个模型,我只是希望能够提取它找到的最佳超参数的值并在不同的 python 文件中使用它。
tuner = keras_tuner.RandomSearch(
hypermodel=build_model,
objective="val_loss",
max_trials=2,
executions_per_trial=2,
overwrite=True,
directory="my_dir",
project_name="helloworld",
)
tuner.search_space_summary()
tuner.search(x_train, y_train, epochs=20, validation_data=(x_val, y_val))
best_hp = tuner.get_best_hyperparameters()[0]
model = tuner.hypermodel.build(best_hp)
summary = tuner.results_summary(num_trials=10)
Run Code Online (Sandbox Code Playgroud)
例如,我想检索 best_hp 列表,或 results_summary 返回到我的终端的最佳超参数的摘要。
我目前正在免费的 Google Colab 实例上使用 Keras Tuner 切换更大的搜索空间。由于使用限制,我的搜索运行将在完成之前中断。我想定期保存搜索进度,以应对这些中断,并在 Colab 资源再次可用时从上一个检查点恢复。我找到了有关如何保存运行中的特定模型的文档,但我想保存搜索的整个状态,包括已经尝试过的内容和这些实验的结果。
我可以直接调用Tuner.get_state()
,保存结果,然后从上次中断的地方继续吗Tuner.set_state()
?或者还有别的办法吗?
我正在使用 Keras Tuner 包。我尝试使用此处解释的示例进行超参数调整https://www.tensorflow.org/tutorials/keras/keras_tuner。代码运行得很好,但是当我开始编写代码时,但是当我尝试第二次和第三次开始时,我遇到了问题。
tuner.search(X_train, Y_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')}.
""")
Run Code Online (Sandbox Code Playgroud)
第二次执行后,代码不会启动并显示上一次的结果。
INFO:tensorflow:Oracle triggered exit
The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is 128 and the optimal learning rate for the optimizer
is 0.001.
Run Code Online (Sandbox Code Playgroud)
那么知道如何解决这个问题吗?