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

使用.npy文件作为CNN输入时ImageDataGenerator验证失败求助

问题原因

flow_from_dataframe默认只识别JPG、PNG这类标准图像格式文件,你传入的是.npy数组文件的路径,它无法将这类文件判定为有效图像源,因此出现“找到0个已验证图像文件名”的报错。

解决方法

以下三种方案按需选择:

方案1:自定义数据生成器(推荐,直接处理.npy)

自己实现一个生成器类,手动读取.npy文件并输出符合要求的训练数据:

import numpy as np
from keras.utils import Sequence

class NPYDataGenerator(Sequence):
    def __init__(self, dataframe, batch_size=32, target_size=(160,160), shuffle=True):
        self.dataframe = dataframe
        self.batch_size = batch_size
        self.target_size = target_size
        self.shuffle = shuffle
        self.indices = np.arange(len(self.dataframe))
        self.on_epoch_end()

    def __len__(self):
        # 计算每个epoch的批次数量
        return int(np.ceil(len(self.dataframe) / self.batch_size))

    def __getitem__(self, index):
        # 获取当前批次的索引
        batch_indices = self.indices[index*self.batch_size : (index+1)*self.batch_size]
        # 读取批次数据
        batch_x = []
        batch_y = []
        for idx in batch_indices:
            # 加载.npy文件
            img_array = np.load(self.dataframe.iloc[idx]['Image Array'])
            # 确保灰度图维度为(160,160,1)
            if img_array.shape != (*self.target_size, 1):
                img_array = np.expand_dims(img_array, axis=-1)
            batch_x.append(img_array)
            batch_y.append(self.dataframe.iloc[idx]['Spin'])
        return np.array(batch_x), np.array(batch_y)

    def on_epoch_end(self):
        # 每个epoch结束后打乱数据顺序
        if self.shuffle:
            np.random.shuffle(self.indices)

# 使用示例
train_generator = NPYDataGenerator(train_set, batch_size=32, target_size=(160,160))
# 训练时直接传入该生成器
model.fit(train_generator, epochs=10)

方案2:将.npy转成图像文件保存

如果一定要用flow_from_dataframe,可以先把所有.npy数组转成PNG/JPG格式的图像:

import numpy as np
from PIL import Image
import os

# 遍历数据集转换并保存图像
for idx, row in train_set.iterrows():
    npy_path = row['Image Array']
    img_array = np.load(npy_path)
    # 将数组转为图像格式(若数组是0-1浮点型,需转成0-255的uint8)
    if img_array.dtype != np.uint8:
        img_array = (img_array * 255).astype(np.uint8)
    # 生成灰度图像
    img = Image.fromarray(img_array, mode='L')
    # 替换后缀为.png保存
    save_path = npy_path.replace('.npy', '.png')
    img.save(save_path)
    # 更新数据集里的路径为图像路径
    train_set.loc[idx, 'Image Array'] = save_path

# 现在可正常使用flow_from_dataframe
train_images = train_generator.flow_from_dataframe(
    dataframe=train_set,
    x_col='Image Array',
    y_col='Spin',
    target_size=(160, 160),
    color_mode='grayscale',
    class_mode='raw',
    batch_size=32,
    shuffle=True,
    seed=42,
    subset='training'
)

方案3:直接加载所有数据到内存(仅适用于小数据集)

如果数据集体积不大、能放进内存,可直接批量加载所有.npy数组:

# 加载全部训练数据
X_train = []
y_train = []
for _, row in train_set.iterrows():
    img_array = np.load(row['Image Array'])
    # 添加灰度图通道维度
    img_array = np.expand_dims(img_array, axis=-1)
    X_train.append(img_array)
    y_train.append(row['Spin'])

X_train = np.array(X_train)
y_train = np.array(y_train)

# 使用ImageDataGenerator的flow方法生成批次
train_generator = train_generator.flow(
    X_train,
    y_train,
    batch_size=32,
    shuffle=True,
    seed=42
)

内容的提问来源于stack exchange,提问作者coderseng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:54:06