Tensorflow Keras自定义数据生成器非常慢
我正在使用Keras自定义数据生成器培训自动编码器。数据太大,无法放入内存 发电机:Tensorflow Keras自定义数据生成器非常慢,tensorflow,keras,deep-learning,autoencoder,Tensorflow,Keras,Deep Learning,Autoencoder,我正在使用Keras自定义数据生成器培训自动编码器。数据太大,无法放入内存 发电机: class Mygenerator(Sequence): def __init__(self, x_set, y_set, batch_size): self.x, self.y = x_set, y_set self.batch_size = batch_size def __len__(self): return int(np.ceil(le
class Mygenerator(Sequence):
def __init__(self, x_set, y_set, batch_size):
self.x, self.y = x_set, y_set
self.batch_size = batch_size
def __len__(self):
return int(np.ceil(len(self.x) / float(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]
# read your data here using the batch lists, batch_x and batch_y
x = [np.reshape(np.load(filename),(52,52,1)) for filename in batch_x] # load array and reshape to fit input layer
y = [np.reshape(np.load(filename),(52,52,1)) for filename in batch_y] # load array and reshape to fit input layer
return np.array(x), np.array(y)
型号fit_发生器:
XTRAINFILES = glob.glob("C:\\x_train\\*.npy")
YTRAINFILES = glob.glob("C:\\y_train\\*.npy")
XTESTFILES = glob.glob("C:\\x_test\\*.npy")
YTESTFILES = glob.glob("C:\\y_test\\*.npy")
autoencoder_model.fit_generator(Mygenerator(XTRAINFILES, YTRAINFILES, 128),
epochs=EPOCHES, workers=8, steps_per_epoch=ceil( len(XTRAINFILES) / 128)
validation_data=Mygenerator(XTESTFILES, YTESTFILES, 128),
validation_steps=ceil( len(XTESTFILES) / 128),
callbacks=[tb_output, checkpoint_callback])
Keras给出了2到3小时的预计到达时间。在没有定制生成器的情况下进行测试,内存中只需要少量数据,每个历元的预计到达时间为20到30分钟
关于PC规格的见解:
- GPU:Geforce RTX 2080 Ti
- 内存:128 GB
尝试的解决方案:将
workers=8
添加到fit generator中,时间稍微缩短了一点,但仍然没有达到预期的fit\u generator()函数似乎有问题,因此您应该使用fit()
您还可以尝试通过以下方式禁用急切执行:
tf.compat.v1.disable_eager_execution()
讨论了这个问题。似乎
fit\u generator()
函数有问题,所以您应该使用fit()
您还可以尝试通过以下方式禁用急切执行:
tf.compat.v1.disable_eager_execution()
这个问题已经讨论过了。我也面临同样的问题。你找到解决方法了吗?如果你使用自定义生成器,基本上没有解决方法。在让模型在低硬件上运行和将数据输入生成器的速度之间,您必须接受一种折衷,后者还取决于外部因素,如硬盘上发生的I/O速度。我花了很多时间搜索这个。我没有尝试的唯一解决方案是使用
use\u multiprocessing=True
。当时,该标志在Windows上无法正常工作。你现在可以试一试,如果情况好转,请告诉我;)我也面临同样的问题。你找到解决方法了吗?如果你使用自定义生成器,基本上没有解决方法。在让模型在低硬件上运行和将数据输入生成器的速度之间,您必须接受一种折衷,后者还取决于外部因素,如硬盘上发生的I/O速度。我花了很多时间搜索这个。我没有尝试的唯一解决方案是使用use\u multiprocessing=True
。当时,该标志在Windows上无法正常工作。你现在可以试一试,如果情况好转,请告诉我;)