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' # 自定义项目名 )
额外代码错误修正
你的代码中存在几处语法和逻辑错误,会直接导致调优失败:
hp_maxpool3 = hp,Int('maxpool3',...):多了一个逗号,应改为hp.Intmodel.add(tf.keras.layers.MaxPool2d(...)):类名应为大写MaxPool2Dhp_layer_4 = hp.Int('layer_3',...):超参数名与layer_3重复,应改为layer_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
相关产品推荐
相关产品推荐

