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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:01:05