Keras flow_from_dataframe报错:目标数据缺失问题求助
问题原因与解决方案
核心错误原因
你设置了class_mode=None,这会让flow_from_dataframe仅返回输入图像数据,完全忽略y_col指定的掩码路径——原生flow_from_dataframe是为分类任务设计的,默认会把y_col内容当作分类标签解析,而非图像路径,因此训练时模型拿不到目标掩码数据,触发Target data is missing错误。
解决方案
方案1:自定义生成器结合ImageDataGenerator
通过自定义生成器同时加载图像和掩码,保证数据增强时两者变换同步:
import cv2 import numpy as np def custom_generator(df, datagen, batch_size, target_size): while True: batch_df = df.sample(n=batch_size).reset_index(drop=True) images = [] masks = [] for _, row in batch_df.iterrows(): # 加载并预处理图像 img = cv2.imread(row['image']) img = cv2.resize(img, target_size) img = img / 255.0 # 加载并预处理掩码(单通道) mask = cv2.imread(row['label'], cv2.IMREAD_GRAYSCALE) mask = cv2.resize(mask, target_size) mask = mask / 255.0 mask = np.expand_dims(mask, axis=-1) # 匹配图像通道维度 images.append(img) masks.append(mask) # 同步增强图像与掩码 augmented = datagen.flow(np.array(images), np.array(masks), batch_size=batch_size, shuffle=True) x, y = next(augmented) yield x, y
使用生成器训练:
train_gen = custom_generator(df, train_datagen, batch_size=32, target_size=(IMAGE_HEIGHT, IMAGE_WIDTH)) model.fit(train_gen, epochs=50, steps_per_epoch=len(df)//32)
方案2:使用tf.data.Dataset加载(推荐)
TensorFlow的tf.data更灵活,适合分割任务的复杂数据加载需求:
import tensorflow as tf def load_image_mask(image_path, mask_path): # 加载图像 img = tf.io.read_file(image_path) img = tf.image.decode_png(img, channels=3) img = tf.image.resize(img, [IMAGE_HEIGHT, IMAGE_WIDTH]) img = tf.cast(img, tf.float32) / 255.0 # 加载掩码 mask = tf.io.read_file(mask_path) mask = tf.image.decode_png(mask, channels=1) mask = tf.image.resize(mask, [IMAGE_HEIGHT, IMAGE_WIDTH]) mask = tf.cast(mask, tf.float32) / 255.0 return img, mask # 构建数据集 train_dataset = tf.data.Dataset.from_tensor_slices((df['image'].values, df['label'].values)) train_dataset = train_dataset.map(load_image_mask, num_parallel_calls=tf.data.AUTOTUNE) train_dataset = train_dataset.batch(32).shuffle(100).prefetch(tf.data.AUTOTUNE)
训练时直接传入数据集:
model.fit(train_dataset, epochs=50)
若需数据增强,可在map后添加tf.keras.layers.RandomFlip、tf.keras.layers.RandomRotation等增强层,或在模型输入层集成增强逻辑。
内容的提问来源于stack exchange,提问作者jw_saja
相关产品推荐
相关产品推荐

