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

如何定义Pandas列为列表?Keras flow_from_dataframe多输出模式报错解决

问题:Keras flow_from_dataframe 多输出模式报错处理

问题场景

使用Keras的ImageDataGenerator进行数据增强,调用flow_from_dataframe函数时,设置class_mode='multi_output'出现报错。

代码实现

创建训练/测试DataFrame:

# Create new dataframes for train and test
import pandas as pd

df_train = pd.DataFrame()
df_train['image'], df_train['labels'] = X_train, y_train

df_test = pd.DataFrame()
df_test['image'], df_test['labels'] = X_test, y_test

DataFrame结构示例:

image   labels
4227  /Users/m/Documents/Machine Learning Pr...  [73, 0]
4676  /Users/m/Documents/Machine Learning Pr...  [36, 0]
800   /Users/m/Documents/Machine Learning Pr...  [26, 0]
3671  /Users/m/Documents/Machine Learning Pr...  [42, 0]

初始化生成器并调用flow_from_dataframe:

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rescale = 1./255,
    rotation_range = 40,
    width_shift_range = 0.2,
    height_shift_range = 0.2,
    shear_range = 0.2,
    zoom_range = 0.2,
    horizontal_flip = True,
    fill_mode = 'nearest'
)

test_datagen= ImageDataGenerator(rescale=1./255.)

train_generator=datagen.flow_from_dataframe(
    dataframe = df_train,
    x_col="image",
    y_col="labels",
    batch_size=32,
    seed=42,
    shuffle=True,
    class_mode='multi_output',
    target_size=(128, 128)
)


valid_generator = test_datagen.flow_from_dataframe(
    dataframe = df_test,
    x_col = "image",
    y_col = "labels",
    batch_size = 32,
    seed = 42,
    shuffle = True,
    class_mode='multi_output',
    target_size=(128, 128)
)

报错信息

TypeError: If class_mode="multi_output", y_col must be a list. Received str.

原因分析

你误解了class_mode='multi_output'的使用逻辑:

  • 该模式用于多任务学习场景,要求y_col是多个目标列的名称列表,每个列对应一个独立的输出任务(比如同时分类和回归)。
  • 你当前的做法是把多个目标值存在单个labels列的列表中,这不符合multi_output的要求——Keras会将单个列名识别为字符串,而非多输出所需的列名列表。

解决方法

1. 拆分目标列

将labels列中的列表值拆分为独立的列,每个列对应一个输出任务:

# 拆分train dataframe的labels列
df_train[['label1', 'label2']] = pd.DataFrame(df_train['labels'].tolist(), index=df_train.index)
# 拆分test dataframe的labels列
df_test[['label1', 'label2']] = pd.DataFrame(df_test['labels'].tolist(), index=df_test.index)

2. 修改生成器参数

将y_col改为拆分后的列名列表,保持class_mode='multi_output':

train_generator=datagen.flow_from_dataframe(
    dataframe = df_train,
    x_col="image",
    y_col=["label1", "label2"],  # 改为列名列表
    batch_size=32,
    seed=42,
    shuffle=True,
    class_mode='multi_output',
    target_size=(128, 128)
)

valid_generator = test_datagen.flow_from_dataframe(
    dataframe = df_test,
    x_col = "image",
    y_col = ["label1", "label2"],  # 同样修改
    batch_size = 32,
    seed = 42,
    shuffle = True,
    class_mode='multi_output',
    target_size=(128, 128)
)

这样生成器会将label1和label2作为两个独立的输出目标,符合multi_output模式的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:15:30