如何定义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
相关产品推荐
相关产品推荐

