TensorBoard HParams面板未显示超参数调优的accuracy指标问题
问题排查:TensorBoard HParams面板Accuracy指标不显示
核心现象
使用TensorFlow HParams插件进行超参数调优时,HParams表格能正常展示dropout、learning rate等超参数,但Accuracy列完全为空;模型训练过程正常,TensorBoard的Scalars面板能清晰看到训练周期内的accuracy变化趋势。
原因定位
hp.KerasCallback仅负责记录超参数配置信息,不会自动将训练/验证阶段的最终accuracy指标写入HParams日志体系。必须手动在训练结束后,将指定指标的结果写入对应日志目录,同时要保证指标名称与hp.Metric中定义的完全匹配。
解决办法
修改训练函数,在model.fit执行完成后,手动读取训练历史或评估模型,将最终accuracy写入HParams日志:
修改后的完整代码
from tensorboard.plugins.hparams import api as hp import tensorflow as tf from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout # 定义超参数 HP_DROPOUT = hp.HParam('dropout', hp.Discrete([0.2, 0.3, 0.4])) HP_LEARNING_RATE = hp.HParam('learning_rate', hp.Discrete([1e-2, 1e-3])) # 初始化HParams日志配置 log_dir = './tensorboard/nn_1' with tf.summary.create_file_writer(log_dir).as_default(): hp.hparams_config( hparams=[HP_DROPOUT, HP_LEARNING_RATE], metrics=[hp.Metric('accuracy', display_name='Accuracy')] ) # 训练函数 def train_test_model(hparams, session_num): model_name = f"model_1_session_{session_num}" print(f"Training {model_name} with hyperparameters {hparams}...") model = tf.keras.Sequential([ Conv2D(32, kernel_size=(3, 3), activation='elu'), Dropout(hparams[HP_DROPOUT]), Conv2D(32, kernel_size=(3, 3), activation='elu'), Dropout(hparams[HP_DROPOUT]), MaxPooling2D(pool_size=(2, 2)), Flatten(), Dense(10, activation='softmax') ]) model.compile( loss='categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(hparams[HP_LEARNING_RATE]), metrics=['accuracy'] ) tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=f'{log_dir}/{model_name}') hparams_callback = hp.KerasCallback(writer=f'{log_dir}/{model_name}', hparams=hparams) # 执行模型训练 history = model.fit( x_train_reshaped, y_train_, epochs=3, validation_data=(x_val_reshaped, y_val), callbacks=[hparams_callback, tensorboard_callback] ) # 关键步骤:手动记录最终accuracy到HParams日志 with tf.summary.create_file_writer(f'{log_dir}/{model_name}').as_default(): # 记录训练集最终accuracy(与hp.Metric定义的名称一致) tf.summary.scalar('accuracy', history.history['accuracy'][-1], step=session_num) # 如果需要记录验证集accuracy,需同步修改hp.Metric配置 # tf.summary.scalar('val_accuracy', history.history['val_accuracy'][-1], step=session_num) # 遍历所有超参数组合执行训练 session_num = 0 for dropout_rate in HP_DROPOUT.domain.values: for learning_rate in HP_LEARNING_RATE.domain.values: hparams = { HP_DROPOUT: dropout_rate, HP_LEARNING_RATE: learning_rate, } train_test_model(hparams, session_num) session_num += 1
额外注意事项
- 指标名称一致性:如果要记录验证集accuracy,需在
hp.hparams_config的metrics中添加hp.Metric('val_accuracy', display_name='Validation Accuracy'),同时在tf.summary.scalar中使用对应的键名val_accuracy。 - 日志目录同步:手动写入日志的目录必须和
hp.KerasCallback使用的目录完全一致,否则HParams无法关联超参数与指标结果。 - 清理旧日志:修改代码后,删除旧的
./tensorboard/nn_1目录再重新训练,避免旧日志数据干扰新结果的展示。
内容的提问来源于stack exchange,提问作者user24151884
相关产品推荐
相关产品推荐

