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

水果数据集图像增强时出现‘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'
)

问题原因

  1. 无效的subset参数:flow_from_dataframe中指定了subset='training'和subset='validation',但对应的ImageDataGenerator并未设置validation_split参数,这会导致数据加载逻辑混乱,触发错误。
  2. 未指定关键列参数:flow_from_dataframe需要明确指定x_col(存储图像文件名/路径的列)和y_col(存储类别的列),如果不声明,程序无法自动识别文件名列,直接引发‘Filename’相关报错。
  3. 变量名覆盖:原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:33:38