如何让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
相关产品推荐
相关产品推荐

