使用Keras Tuner训练模型时遇HyperModel.fit()返回值错误求助
Keras Tuner训练模型报错的解决方案
核心错误原因
- 未指定优化目标:创建
RandomSearch时未传入objective参数,Keras Tuner默认要求模型训练后返回单个float值作为优化依据,但model.fit()默认返回的是History对象,因此触发错误。 - 损失函数与任务不匹配:模型输出层为
Dense(10, activation='softmax')(适用于10分类任务),但编译时使用了回归任务的mean_absolute_error损失,逻辑矛盾导致指标异常。 - 代码与描述不符:你提到训练LSTM模型,但代码中未使用
layers.LSTM层,实际构建的是全连接网络。
分步解决步骤
1. 指定Keras Tuner的优化目标
在初始化RandomSearch时添加objective参数,Keras Tuner会自动从训练History中提取对应指标:
tuner = RandomSearch( build_model, max_trials=20, executions_per_trial=5, objective='val_accuracy' # 可根据需求替换为'val_loss' )
2. 修正损失函数与模型编译配置
针对多分类任务,替换损失函数并添加评估指标:
- 若标签为整数格式(如0-9的数字标签):
model.compile( optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-4])), loss='sparse_categorical_crossentropy', metrics=['accuracy'] )
- 若标签为one-hot编码格式:
model.compile( optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-4])), loss='categorical_crossentropy', metrics=['accuracy'] )
3. 修复变量名笔误
代码中best_model.fit(img_train, label_train, ...)的变量名与前面的x_train、y_train不一致,需统一:
history = best_model.fit(x_train, y_train, epochs=50, validation_split=0.2)
4. (可选)改为LSTM模型
如果确实需要训练LSTM模型,调整网络结构以适配序列输入(输入形状需为(时间步长, 特征数)):
def build_model(hp): model=keras.Sequential() # 替换为LSTM层,需根据你的数据调整时间步长参数 model.add(layers.LSTM(units=hp.Int('lstm_units', 64, 128, step=16), input_shape=(时间步长, totalColumns))) for i in range(hp.Int('dense_layers',2,8)): model.add(layers.Dense(units=hp.Int('units_'+str(i),50,100,step = 10), activation=hp.Choice('act_'+str(i),['relu','sigmoid']))) model.add(layers.Dense(10,activation='softmax')) model.compile( optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-4])), loss='sparse_categorical_crossentropy', metrics=['accuracy'] ) return model
内容的提问来源于stack exchange,提问作者Sanchit Jain
相关产品推荐
相关产品推荐

