使用Keras Tuner调参回归ANN时出现KeyError: 'val_mean_absolute_error'
Keras Tuner超参数调优触发KeyError: 'val_mean_absolute_error'的原因及解决
问题重现
尝试用Keras Tuner对回归人工神经网络(ANN)做超参数调优时,执行超参数搜索收到错误:KeyError: 'val_mean_absolute_error'
代码
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' )) if hp.Boolean("dropout"): model.add(layers.Dropout(rate=0.5)) model.add(layers.Dense(1, activation='linear')) model.compile( optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', [1e-4, 1e-3, 1e-5])), loss='mean_absolute_error', metrics=['mean_absolute_error'] ) return model tuner = kt.RandomSearch( build_model, objective='val_mean_absolute_error', max_trials=5, executions_per_trial=2, overwrite=True, directory="Local Files", project_name="Keras") tuner.search(x_train, y_train, epochs=1)
报错回溯
Traceback (most recent call last): File "c:\Users\{user}\.venv\lib\site-packages\keras_tuner\engine\base_tuner.py", line 266, in _try_run_and_update_trial self._run_and_update_trial(trial, *fit_args, **fit_kwargs) File "c:\Users\{user}\.venv\lib\site-packages\keras_tuner\engine\base_tuner.py", line 257, in _run_and_update_trial tuner_utils.convert_to_metrics_dict( File "c:\Users\{user}\.venv\lib\site-packages\keras_tuner\engine\tuner_utils.py", line 270, in convert_to_metrics_dict [convert_to_metrics_dict(elem, objective) for elem in results] File "c:\Users\{user}\.venv\lib\site-packages\keras_tuner\engine\tuner_utils.py", line 270, in <listcomp> [convert_to_metrics_dict(elem, objective) for elem in results] File "c:\Users\{user}\.venv\lib\site-packages\keras_tuner\engine\tuner_utils.py", line 283, in convert_to_metrics_dict best_value, _ = _get_best_value_and_best_epoch_from_history( File "c:\Users\{user}\.venv\lib\site-packages\keras_tuner\engine\tuner_utils.py", line 254, in _get_best_value_and_best_epoch_from_history objective_value = objective.get_value(metrics) File "c:\Users\{user}\.venv\lib\site-packages\keras_tuner\engine\objective.py", line 57, in get_value return logs[self.name] KeyError: 'val_mean_absolute_error'
原因分析
你指定的优化目标是val_mean_absolute_error(验证集平均绝对误差),但调用tuner.search()时既没有传入单独的验证集数据,也没有设置validation_split参数划分训练集的一部分作为验证集。Keras Tuner无法计算验证集指标,因此找不到val_mean_absolute_error这个键,触发KeyError。
解决方法
方法1:提供验证集数据
在tuner.search()中添加验证集相关参数,两种方式任选其一:
- 用
validation_split从训练集中划分比例作为验证集:
tuner.search(x_train, y_train, epochs=1, validation_split=0.2) # 划分20%训练数据为验证集
- 传入提前准备好的验证集:
tuner.search(x_train, y_train, epochs=1, validation_data=(x_val, y_val))
方法2:修改优化目标为训练集指标
如果不需要验证集评估,直接把目标改为训练集的mean_absolute_error:
tuner = kt.RandomSearch( build_model, objective='mean_absolute_error', # 替换为训练集指标 max_trials=5, executions_per_trial=2, overwrite=True, directory="Local Files", project_name="Keras")
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

