使用Keras flow_from_dataframe处理回归任务遇class_mode参数问题求助
解决flow_from_dataframe用于图像回归任务的问题
你提到的flow_from_dataframe其实是支持回归任务的,class_mode="raw"就是专门用来处理数值型回归标签的参数,你的问题大概率出在代码细节或数据预处理上,以下是具体修正方案:
1. 修正代码中的关键错误
- steps_per_epoch计算错误:你写的
len(train_data/batch_size)是把整个训练集长度除以batch_size,但这里应该用当前折的训练集training_data的长度,并且用整数除法避免小数:steps_per_epoch = len(training_data) // batch_size # 如果训练集长度不能被batch_size整除,也可以加1确保遍历所有样本: # steps_per_epoch = (len(training_data) + batch_size - 1) // batch_size - 验证集生成器的目录一致性:注意
valid_image_dir是否和训练集的图像目录一致,如果测试集图像也在同一个目录下,应该统一用train_image_dir,避免找不到图像。
2. 确保标签数据类型正确
y_col="time"对应的列必须是数值类型(float/int),如果你的Excel里该列是字符串格式,会导致flow_from_dataframe无法正确返回回归标签,需要提前转换:
import pandas as pd # 转换为数值类型,错误值设为NaN并处理 train_data['time'] = pd.to_numeric(train_data['time'], errors='coerce') # 移除含缺失值的行 train_data = train_data.dropna(subset=['time'])
3. 模型编译适配回归任务
你的compile_model()函数必须使用回归任务对应的损失函数和指标,不能用分类任务的配置:
def compile_model(): # 示例CNN结构,替换成你的模型 model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape=(224,224,3)), tf.keras.layers.Conv2D(32, (3,3), activation='relu'), tf.keras.layers.GlobalAveragePooling2D(), tf.keras.layers.Dense(1) # 回归任务最后一层是单输出,无激活函数 ]) # 损失用均方误差(MSE),指标用平均绝对误差(MAE) model.compile(optimizer='adam', loss='mse', metrics=['mae']) return model
4. 关于模型训练函数的说明
如果你用的是较新版本的TensorFlow,fit_generator已经被弃用,建议直接用model.fit(),它可以直接接收数据生成器:
history = model.fit( train_data_generator, validation_data=valid_data_generator, epochs=epochs, callbacks=callbacks, workers=8, steps_per_epoch=steps_per_epoch, validation_steps=len(validation_data)//batch_size # 建议加上验证集步数 )
内容的提问来源于stack exchange,提问作者deniyoring
相关产品推荐
相关产品推荐

