KerasTuner:带有随机搜索错误的目标中的自定义指标(例如 F1 分数、AUC)

问题描述 投票:0回答:1

我正在使用 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 的客观指标,我将非常感激。非常感谢!

python tensorflow keras
1个回答
0
投票

官方文档中的指南KerasTuner入门回答了您的问题:

在前面的所有示例中,我们都只是使用验证准确性(“val_accuracy”)作为调整目标来选择最佳模型。实际上,您可以使用任何指标作为目标。最常用的指标是“val_loss”,即验证损失。

您可以使用两种类型的指标:

  • 内置指标。您可以在官方文档中找到内置指标列表:Keras Metrics
  • 自定义指标:这些指标,您需要通过子类化
    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 定义的,或者自己定义指标(请参阅指南:创建自定义指标
  • 定义目标时使用正确的名称。如果您使用 TensorFlow 中定义的,则可以使用
    val_f1_score
    作为名称(如果您希望使用根据验证数据计算的 f1 分数作为目标)。

对您想要使用的每个指标重复这些步骤。

© www.soinside.com 2019 - 2024. All rights reserved.