基于Keras Sequence实现DataGenerator遇FileNotFoundError求助
解决多进程下DataGenerator的FileNotFoundError问题
你遇到的核心问题是多进程训练时,子进程无法正确解析图片路径——哪怕你在主进程里确认路径没问题,子进程的工作目录可能和主进程不一致,导致imread找不到目标文件。下面是具体的修复方案:
核心修改:将路径转为绝对路径
在DataGenerator的初始化阶段,就把所有相对路径转换成绝对路径。这样不管子进程的工作目录是什么,都能精准定位到文件。
修改后的代码如下(需要新增os模块导入):
import tensorflow.keras as keras from skimage.io import imread from skimage.transform import resize import numpy as np import math import os # 新增导入os模块 from tensorflow.keras.utils import Sequence class DataGenerator(Sequence): def __init__(self, x_set, y_set, batch_size): # 将所有图片路径转为绝对路径 self.x = [os.path.abspath(file_path) for file_path in x_set] self.y = y_set self.batch_size = batch_size def __len__(self): return math.ceil(len(self.x) / self.batch_size) def __getitem__(self, idx): batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size] batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size] return np.array([ resize(imread(file_name), (224, 224)) for file_name in batch_x]), np.array(batch_y)
额外排查建议
为了提前发现路径问题,避免训练到一半才报错,可以在初始化时加个路径存在性检查:
def __init__(self, x_set, y_set, batch_size): self.x = [] for file_path in x_set: abs_path = os.path.abspath(file_path) if not os.path.exists(abs_path): print(f"⚠️ 警告:找不到文件 {abs_path}") self.x.append(abs_path) self.y = y_set self.batch_size = batch_size
小优化:替换弃用的fit_generator
另外提一句,TensorFlow 2.0+中fit_generator已经被弃用了,你可以直接用model.fit()传入generator,用法完全一致:
model.fit(generator=training_generator, validation_data=validation_generator, steps_per_epoch = num_train_samples // 32, validation_steps = num_val_samples // 32, epochs = 10, use_multiprocessing=True, workers=2)
内容的提问来源于stack exchange,提问作者Tobitor
相关产品推荐
相关产品推荐

