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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:15:34