水果数据集图像增强时出现‘Filename’错误求助
水果数据集图像增强报错问题解决
我在水果数据集上尝试实现图像增强,原本未使用增强时模型可正常运行,但验证准确率极低。采用图像增强后却触发了末尾含‘Filename’的错误。
数据集分割代码及输出
分割数据集代码:
train_data,val_data = sklearn.model_selection.train_test_split(data,test_size=0.2) print(train_data.shape) print(val_data.shape)
输出结果:
(45191, 2) (11298, 2)
图像增强与数据加载代码
train_datagen = tf.keras.preprocessing.image.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', ) validation_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255) train_data = train_datagen.flow_from_dataframe( dataframe = train_data, color_mode = 'rgb', class_mode = 'categorical', target_size=(300, 300), shuffle = True, subset = 'training' ) val_data = validation_datagen.flow_from_dataframe( dataframe = val_data, color_mode = 'rgb', class_mode = 'categorical', target_size=(300, 300), shuffle = False, subset = 'validation' )
问题原因
- 无效的
subset参数:flow_from_dataframe中指定了subset='training'和subset='validation',但对应的ImageDataGenerator并未设置validation_split参数,这会导致数据加载逻辑混乱,触发错误。 - 未指定关键列参数:
flow_from_dataframe需要明确指定x_col(存储图像文件名/路径的列)和y_col(存储类别的列),如果不声明,程序无法自动识别文件名列,直接引发‘Filename’相关报错。 - 变量名覆盖:原
train_data和val_data是DataFrame类型,被赋值为DirectoryIterator后,后续若有依赖原DataFrame的操作会出错(虽不是本次报错直接原因,但需规范)。
修正方案
1. 规范数据集分割(避免变量覆盖)
# 改用train_df、val_df存储分割后的DataFrame,避免覆盖后续要用到的生成器变量 train_df, val_df = sklearn.model_selection.train_test_split(data, test_size=0.2) print(train_df.shape) print(val_df.shape)
2. 修正图像增强与数据加载代码
train_datagen = tf.keras.preprocessing.image.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', ) validation_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255) train_data = train_datagen.flow_from_dataframe( dataframe=train_df, x_col='图像文件名列名', # 替换成你DataFrame中存储图像路径/文件名的实际列名 y_col='类别列名', # 替换成你DataFrame中存储类别的实际列名 color_mode='rgb', class_mode='categorical', target_size=(300, 300), shuffle=True ) val_data = validation_datagen.flow_from_dataframe( dataframe=val_df, x_col='图像文件名列名', # 与上方保持一致 y_col='类别列名', # 与上方保持一致 color_mode='rgb', class_mode='categorical', target_size=(300, 300), shuffle=False )
额外说明
如果想通过subset参数实现数据划分,无需提前用train_test_split分割,直接在ImageDataGenerator中设置validation_split即可,示例如下:
# 初始化带验证分割的生成器 datagen = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1./255, rotation_range=40, width_shift_range=0.2, # 其他增强参数... validation_split=0.2 # 预留20%数据作为验证集 ) # 加载训练集 train_data = datagen.flow_from_dataframe( dataframe=data, x_col='图像文件名列名', y_col='类别列名', subset='training', # 其他参数... ) # 加载验证集 val_data = datagen.flow_from_dataframe( dataframe=data, x_col='图像文件名列名', y_col='类别列名', subset='validation', # 其他参数... )
内容的提问来源于stack exchange,提问作者Nugget
相关产品推荐
相关产品推荐

