Keras LSTM模型Hyperband调参报错:KeyError 'val_mean_squared_error'
解决Keras Tuner Hyperband的KeyError: 'val_mean_squared_error'问题
问题重现
模型构建代码
def model_builder(hp): model = Sequential() hp_units = hp.Int('units', min_value=32, max_value=512, step=32) model.add(LSTM(units=hp_units, input_shape=(trainX.shape[1], trainX.shape[2]))) model.add(Dropout(0.2)) model.add(Dense(1)) hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) model.compile(loss='mean_squared_error', optimizer='adam') return model
调参器设置
tuner = kt.Hyperband(model_builder, objective='val_mean_squared_error', max_epochs=10, factor=3)
运行代码
tuner.search(X_train, y_train, epochs=50, validation_split=0.2, callbacks=[stop_early])
错误信息
Search: Running Trial #3 Value |Best Value So Far |Hyperparameter 64 |352 |units 0.0001 |0.01 |learning_rate 2 |2 |tuner/epochs 0 |0 |tuner/initial_epoch 2 |2 |tuner/bracket 0 |0 |tuner/round Epoch 1/2 104/104 ━━━━━━━━━━━━━━━━━━━━ 6s 29ms/step - loss: 0.0641 - val_loss: 0.0042 Epoch 2/2 104/104 ━━━━━━━━━━━━━━━━━━━━ 2s 24ms/step - loss: 0.0074 - val_loss: 0.0043 Traceback (most recent call last): File "/home/tillys/python/usr/local/lib/python3.10/site-packages/keras_tuner/src/engine/base_tuner.py", line 274, in _try_run_and_update_trial self._run_and_update_trial(trial, *fit_args, **fit_kwargs) File "/home/tillys/python/usr/local/lib/python3.10/site-packages/keras_tuner/src/engine/base_tuner.py", line 265, in _run_and_update_trial tuner_utils.convert_to_metrics_dict( File "/home/tillys/python/usr/local/lib/python3.10/site-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 "/home/tillys/python/usr/local/lib/python3.10/site-packages/keras_tuner/src/engine/tuner_utils.py", line 132, in <listcomp> [convert_to_metrics_dict(elem, objective) for elem in results] File "/home/tillys/python/usr/local/lib/python3.10/site-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 "/home/tillys/python/usr/local/lib/python3.10/site-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 "/home/tillys/python/usr/local/lib/python3.10/site-packages/keras_tuner/src/engine/objective.py", line 59, in get_value return logs[self.name] KeyError: 'val_mean_squared_error'
错误原因
当模型仅指定loss='mean_squared_error'而未显式声明metrics时,Keras训练日志中只会生成loss和val_loss字段,不会出现mean_squared_error和val_mean_squared_error。但调参器的objective设置为val_mean_squared_error,导致Keras Tuner无法在日志中找到对应字段,抛出KeyError。
另外,代码存在隐性问题:定义了hp_learning_rate但未传递给Adam优化器,导致学习率调参完全未生效。
修复方案
方案一:显式添加metrics,匹配调参器objective
修改model_builder中的编译代码,添加metrics=['mean_squared_error'],同时将学习率参数传入Adam优化器:
from tensorflow.keras.optimizers import Adam def model_builder(hp): model = Sequential() hp_units = hp.Int('units', min_value=32, max_value=512, step=32) model.add(LSTM(units=hp_units, input_shape=(trainX.shape[1], trainX.shape[2]))) model.add(Dropout(0.2)) model.add(Dense(1)) hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4]) model.compile( loss='mean_squared_error', optimizer=Adam(learning_rate=hp_learning_rate), metrics=['mean_squared_error'] ) return model
训练日志会生成val_mean_squared_error字段,与调参器的objective匹配。
方案二:修改调参器objective为val_loss
模型的loss本身就是均方误差,val_loss的值和val_mean_squared_error完全一致,直接修改调参器的objective即可(仍建议修复学习率传递问题):
tuner = kt.Hyperband(model_builder, objective='val_loss', max_epochs=10, factor=3)
内容的提问来源于stack exchange,提问作者Son
相关产品推荐
相关产品推荐

