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

TensorFlow Keras Tuner仅运行一次后不再执行的问题求助

Keras Tuner仅能运行一次的问题解决

问题现象

首次运行超参数调优代码后,再次执行时仅输出flow_from_directory找到的图片数量,Tuner不再执行超参数搜索。终止Python进程后问题仍存在,推测是Keras Tuner的检查点机制认为调优已完成。

核心原因

Keras Tuner默认会将调优进度、检查点保存到当前目录下的untitled_project文件夹,再次运行时会读取该目录的状态,判断任务已完成,因此跳过搜索。

解决方法

方法1:强制覆盖现有检查点

初始化Tuner时添加overwrite=True参数,强制忽略已有的检查点状态,重新开始搜索:

tuner = kt.Hyperband(model_finder,
                     objective='val_accuracy',
                     max_epochs=30,
                     overwrite=True  # 新增参数
                     )

方法2:删除默认保存目录

手动删除当前目录下的untitled_project文件夹,或者每次运行前通过代码自动清理:

import shutil
# 清理Tuner默认保存目录
if os.path.exists('untitled_project'):
    shutil.rmtree('untitled_project')

方法3:指定自定义项目名

初始化Tuner时通过project_name指定不同的目录名,每次运行用新名字避免状态冲突:

tuner = kt.Hyperband(model_finder,
                     objective='val_accuracy',
                     max_epochs=30,
                     project_name='my_custom_tuning_task'  # 自定义项目名
                     )

额外代码错误修正

你的代码中存在几处语法和逻辑错误,会直接导致调优失败:

  1. hp_maxpool3 = hp,Int('maxpool3',...):多了一个逗号,应改为hp.Int
  2. model.add(tf.keras.layers.MaxPool2d(...)):类名应为大写MaxPool2D
  3. hp_layer_4 = hp.Int('layer_3',...):超参数名与layer_3重复,应改为layer_4
  4. 损失函数SparseCategoricalCrossentropy(from_logits=True):输出层用了sigmoid激活,from_logits应设为False(或输出层改用linear激活)

修正后的完整代码

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
import os
import pathlib
import shutil
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import keras_tuner as kt

# 可选:自动清理Tuner默认保存目录
if os.path.exists('untitled_project'):
    shutil.rmtree('untitled_project')

train_directory = '/home/student/Documents/ML & AI Team/Benjamin Collier/datasets/labeled folders/training'
test_directory = '/home/student/Documents/ML & AI Team/Benjamin Collier/datasets/labeled folders/test'
image_width = 250
image_height = 250
batch_size = 64

pys_d = tf.config.list_physical_devices("GPU")
tf.config.experimental.set_memory_growth(pys_d[0], True)

datagen = ImageDataGenerator(
    rescale=1./255,
    validation_split=0.0,
    data_format='channels_last',
    horizontal_flip=True, 
    vertical_flip=True,
    rotation_range=15,
    brightness_range=[0.6,1.5],
    width_shift_range=0.05,
    height_shift_range=0.05,
)
train_gen = datagen.flow_from_directory(
    train_directory,
    target_size=(image_width, image_height),
    batch_size=batch_size,
    class_mode='sparse',
    shuffle=True,
    subset='training',
    seed=13,
)

testgen = ImageDataGenerator(
    rescale=1./255,
    validation_split=0.0,
    data_format='channels_last',
)
test_gen = testgen.flow_from_directory(
    test_directory,
    target_size=(image_width, image_height),
    batch_size=batch_size,
    class_mode='sparse',
    shuffle=True,
    subset='training',
    seed=13,
)

def model_finder(hp):
    model = tf.keras.Sequential()
    hp_layer_1 = hp.Int('layer_1', min_value=10, max_value=60, step=5)
    hp_layer_2 = hp.Int('layer_2', min_value=10, max_value=60, step=5)
    hp_layer_1fliter = hp.Int('kernel_1', min_value=1, max_value=6, step=1)
    hp_maxpool = hp.Int('maxpool', min_value=1, max_value=4, step=1)
    hp_maxpool2 = hp.Int('maxpool2', min_value=1, max_value=4, step=1)
    hp_maxpool3 = hp.Int('maxpool3', min_value=1, max_value=4, step=1)  # 修正逗号错误
    hp_layer_2fliter = hp.Int('kernel_2', min_value=1, max_value=6, step=1)
    hp_layer_3 = hp.Int('layer_3', min_value=10, max_value=60, step=5)
    hp_layer_3kernel = hp.Int('kernel_3', min_value=1, max_value=6, step=1)
    hp_layer_4 = hp.Int('layer_4', min_value=64, max_value=256, step=64)  # 修正参数名重复
    hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])

    model.add(tf.keras.layers.Conv2D(filters=hp_layer_1, activation='relu', kernel_size=hp_layer_1fliter, input_shape=(image_width, image_height, 3)))
    model.add(tf.keras.layers.MaxPool2D(pool_size=(hp_maxpool)))
    model.add(tf.keras.layers.Conv2D(filters=hp_layer_2, activation='relu', kernel_size=hp_layer_2fliter))
    model.add(tf.keras.layers.MaxPool2D(pool_size=(hp_maxpool2)))
    model.add(tf.keras.layers.Conv2D(filters=hp_layer_3, activation='relu', kernel_size=hp_layer_3kernel))
    model.add(tf.keras.layers.MaxPool2D(pool_size=(hp_maxpool3)))  # 修正类名大小写
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dropout(0.1))
    model.add(tf.keras.layers.Dense(units=hp_layer_4, activation='relu'))
    model.add(tf.keras.layers.Dense(2, activation='sigmoid'))

    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=hp_learning_rate),
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),  # 修正from_logits参数
                  metrics=['accuracy'])
    return model

tuner = kt.Hyperband(model_finder,
                     objective='val_accuracy',
                     max_epochs=30,
                     overwrite=True  # 强制覆盖检查点
                     )

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
tuner.search(train_gen, epochs=50, validation_data=test_gen, callbacks=[stop_early])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:47:10