You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让keras-tuner仅保存最优模型且不生成trial目录?

解决Keras Tuner仅保存最优模型且不生成trial_XXXX目录的方案

要彻底避免生成trial_XXXX目录,同时只保留最优模型,需要从自定义Tuner逻辑和目录管理两方面入手,以下是可落地的实现方式:

1. 自定义Tuner类,重写核心方法

通过继承目标Tuner(比如Hyperband),重写run_trial和save_model方法,既阻止trial目录残留,又仅保存最优模型:

import keras_tuner as kt
from tensorflow import keras
import shutil
import os

class CustomHyperband(kt.Hyperband):
    def run_trial(self, trial, *args, **kwargs):
        # 执行父类的训练逻辑
        super().run_trial(trial, *args, **kwargs)
        
        # 训练完成后立即删除当前trial的目录
        trial_dir = self._get_trial_dir(trial.trial_id)
        if os.path.exists(trial_dir):
            shutil.rmtree(trial_dir)

    def save_model(self, trial_id, model, step=0):
        # 仅保存当前最优的模型,覆盖旧模型
        best_trial = self.oracle.get_best_trials(num_trials=1)[0]
        if trial_id == best_trial.trial_id:
            model.save("best_model.h5")  # 自定义最优模型的保存路径和文件名
        # 非最优模型直接跳过保存

2. 配合临时目录与Oracle配置使用

使用临时目录存储Tuner的中间文件,程序结束后自动清理;同时设置keep_top_k=1,让Oracle仅保留最优试验的信息:

import tempfile
# 假设你已经有训练集x_train、y_train和验证集x_val、y_val
def build_model(hp):
    model = keras.Sequential()
    model.add(keras.layers.Dense(
        units=hp.Int('units', min_value=32, max_value=512, step=32),
        activation='relu'
    ))
    model.add(keras.layers.Dense(10, activation='softmax'))
    model.compile(
        optimizer=keras.optimizers.Adam(
            hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
        ),
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy']
    )
    return model

# 使用临时目录存储Tuner的中间数据,自动清理
with tempfile.TemporaryDirectory() as temp_dir:
    tuner = CustomHyperband(
        build_model,
        objective='val_accuracy',
        max_epochs=10,
        factor=3,
        directory=temp_dir,
        project_name='hyperband_search',
        overwrite=True,
        oracle_kwargs={'keep_top_k': 1}  # 仅保留最优试验
    )
    
    # 启动搜索,无需传入ModelCheckpoint回调
    tuner.search(
        x_train, y_train,
        epochs=10,
        validation_data=(x_val, y_val),
        verbose=1
    )

关键说明

  • run_trial中删除目录:父类完成训练和评估后,trial目录已无保留必要,实时删除可避免磁盘占用
  • save_model的过滤逻辑:通过对比当前trial_id与最优trial_id,仅保存最优模型并覆盖旧文件
  • 临时目录的作用:即使Tuner生成少量中间文件,也会在with块结束后自动删除,不会残留
  • keep_top_k=1:Oracle仅记录最优试验的参数,减少内存和磁盘占用

内容的提问来源于stack exchange,提问作者m13op22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:05:18