我正在使用 KerasTuner 对 Keras 神经网络进行超参数调整。我想使用 F1 分数、AUC 和 ROC 等常用指标作为调整目标的一部分。但是,当我在 RandomSearch 期间在 kt.Objective 中指定这些指标时,我遇到了 KerasTuner 在训练期间未在日志中找到这些指标的问题。
以下是我如何定义目标的示例:
tuner = kt.RandomSearch(
MyHyperModel(),
objective=kt.Objective("val_f1", direction="max"),
max_trials=100,
overwrite=True,
directory="my_dir",
project_name="tune_hypermodel",
)
但我明白:
RuntimeError: Number of consecutive failures exceeded the limit of 3.
Traceback (most recent call last):
File "/usr/local/lib/python3.10/dist-packages/keras_tuner/src/engine/base_tuner.py", line 273, in _try_run_and_update_trial
self._run_and_update_trial(trial, *fit_args, **fit_kwargs)
File "/usr/local/lib/python3.10/dist-packages/keras_tuner/src/engine/base_tuner.py", line 264, in _run_and_update_trial
tuner_utils.convert_to_metrics_dict(
File "/usr/local/lib/python3.10/dist-packages/keras_tuner/src/engine/tuner_utils.py", line 132, in convert_to_metrics_dict
[convert_to_metrics_dict(elem, objective) for elem in results]
File "/usr/local/lib/python3.10/dist-packages/keras_tuner/src/engine/tuner_utils.py", line 132, in <listcomp>
[convert_to_metrics_dict(elem, objective) for elem in results]
File "/usr/local/lib/python3.10/dist-packages/keras_tuner/src/engine/tuner_utils.py", line 145, in convert_to_metrics_dict
best_value, _ = _get_best_value_and_best_epoch_from_history(
File "/usr/local/lib/python3.10/dist-packages/keras_tuner/src/engine/tuner_utils.py", line 116, in _get_best_value_and_best_epoch_from_history
objective_value = objective.get_value(metrics)
File "/usr/local/lib/python3.10/dist-packages/keras_tuner/src/engine/objective.py", line 59, in get_value
return logs[self.name]
KeyError: 'val_f1'
如果有人可以直接指导我了解 Keras 文档中可用的实际指标,我将非常感激,因为我已经搜索了又搜索,但似乎找不到它们。唯一对我有用的代码片段是使用这样的准确性指标
import keras_tuner as kt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.regularizers import l2
from kerastuner.tuners import RandomSearch
class MyHyperModel(kt.HyperModel):
def build(self, hp):
model = Sequential()
model.add(layers.Flatten())
model.add(
layers.Dense(
units=hp.Int("units", min_value=24, max_value=128, step=10),
activation="relu",
)
)
model.add(layers.Dense(1, activation="sigmoid"))
model.compile(
optimizer=Adam(learning_rate=hp.Float('learning_rate', 5e-5, 5e-1, step=0.001)),#,Adam(learning_rate=hp.Float('learning_rate', 5e-5, 5e-1, sampling='log')),
loss='binary_crossentropy',
metrics=['accuracy']
)
return model
def fit(self, hp, model, *args, **kwargs):
return model.fit(
*args,
batch_size=hp.Choice("batch_size", [16, 32,52]),
epochs=hp.Int('epochs', min_value=5, max_value=25, step=5),
**kwargs,
)
tuner = kt.RandomSearch(
MyHyperModel(),
objective="val_accuracy",
max_trials=100,
overwrite=True,
directory="my_dir",
project_name="tune_hypermodel",
)
tuner.search(X_train, y_train, validation_data=(X_test, y_test), callbacks=[keras.callbacks.EarlyStopping('val_loss', patience=3)])
Keras 是否有可能只支持准确性作为默认指标,而我们必须自己定义任何其他指标?如果您能帮我找到文档或向我展示如何定义 AUC 和 F1 的客观指标,我将非常感激。非常感谢!
官方文档中的指南KerasTuner入门回答了您的问题:
在前面的所有示例中,我们都只是使用验证准确性(“val_accuracy”)作为调整目标来选择最佳模型。实际上,您可以使用任何指标作为目标。最常用的指标是“val_loss”,即验证损失。
您可以使用两种类型的指标:
Metrics
类来自行定义它们。在这两种情况下,在定义
Objective
时,您需要使用要用作目标的 Metric 对象的 name
属性。指南说得很清楚:
识别目标名称字符串。目标的名称字符串 始终采用 f"val_{metric_name_string}" 格式。例如, 评估均方误差的目标名称字符串 验证数据应为“val_mean_absolute_error”。
请注意,用作目标的指标应与模型一起编译:
使用内置指标编译模型。例如,你想要 使用 MeanAbsoluteError()。您需要使用以下命令来编译模型 指标=[MeanAbsoluteError()]。您也可以使用它的名称字符串 相反:metrics=["mean_absolute_error"]。的名称字符串 metric 始终是类名的蛇形形式。
因此,就您的情况而言,鉴于您想使用 F1 指标作为目标,您需要:
MyHyperModel
。如果您使用 TensorFlow 作为后端(或使用 Keras 2.15),则可以使用 由 TensorFlow 定义的,或者自己定义指标(请参阅指南:创建自定义指标)val_f1_score
作为名称(如果您希望使用根据验证数据计算的 f1 分数作为目标)。对您想要使用的每个指标重复这些步骤。