我正在用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(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_generator:
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给出的ETA在2到3小时之间。在没有自定义生成器的情况下进行测试,只需在内存中放入少量数据,每个历元的ETA为20到30分钟。
关于PC规格的见解:
- GPU:Geforce RTX 2080 Ti
- 内存:128 GB
尝试的解决方案:将workers = 8
添加到拟合生成器中,时间略有改善,但仍不足以接近预期的
fit_generator()
函数似乎有问题,所以您应该使用fit()
。
您也可以尝试使用以下命令禁用热切执行:
tf.compat.v1.disable_eager_execution()
这里讨论这个问题。