使用.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
相关产品推荐
相关产品推荐

