Tensorflow 如何使用Keras中的\u目录中的流\u重复数据
我正在尝试使用keras从目录中流动来训练模型。但它不会重复 历元之后的数据(即当所有数据都已迭代时)。我找不到 也可以选择这样做。下面是我在培训期间生成数据的代码。 例如,如果总图像数=70 批量大小=32 然后在第一次和第二次迭代中,is给出了32幅图像,但在第三次迭代中,它给出了6幅图像Tensorflow 如何使用Keras中的\u目录中的流\u重复数据,tensorflow,keras,deep-learning,data-generation,Tensorflow,Keras,Deep Learning,Data Generation,我正在尝试使用keras从目录中流动来训练模型。但它不会重复 历元之后的数据(即当所有数据都已迭代时)。我找不到 也可以选择这样做。下面是我在培训期间生成数据的代码。 例如,如果总图像数=70 批量大小=32 然后在第一次和第二次迭代中,is给出了32幅图像,但在第三次迭代中,它给出了6幅图像 # data generation from directory without labels trn = datagen.flow_from_directory(os.path.join(BASE,
# data generation from directory without labels
trn = datagen.flow_from_directory(os.path.join(BASE, 'train_gen'),
batch_size=batch_size,
target_size=(inp_shape[:2]),
class_mode=None)
X = trn.next() # getting a batch of data.
我希望数据生成器在耗尽数据后开始重复数据
实际上,我正在尝试训练一个GAN,从生成器模型生成一批图像,然后将其与一批真实图像连接,然后传递到鉴别器模型和GAN模型进行训练。我不知道如何使用fit\u generator,代码如下:
def train(self, inp_shape, batch_size=1, n_epochs=1000):
BASE = '/content/gdrive/My Drive/Dataset/GAN'
datagen = ImageDataGenerator(rescale=1./255)
trn_dist = datagen.flow_from_directory(os.path.join(BASE, 'train_gen'),
batch_size=batch_size,
target_size=(inp_shape[:2]),
seed = 1360000,
class_mode=None)
val_dist = datagen.flow_from_directory(os.path.join(BASE, 'test_gen'),
batch_size=batch_size,
target_size=(inp_shape[:2]),
class_mode=None)
trn_real = datagen.flow_from_directory(os.path.join(BASE, 'train_real'),
batch_size=batch_size,
target_size=(inp_shape[:2]),
seed = 1360000,
class_mode=None)
for e in range(n_epochs):
real_images = trn_real.next()
dist_images = trn_dist.next()
gen_images = self.generator.predict(dist_images)
factor = inp_shape[0]/250
gen_res = ndi.zoom(gen_images, (1, factor, factor, 1), order=2)
X = np.concatenate([real_images, gen_res])
y = np.zeros(2*batch_size)
y[:batch_size] = 1.
self.discriminator.trainable = True
self.discriminator.fit(X, y, batch, n_epochs)
self.discriminator.trainable = False
self.model.fit(gen_res, y[:batch_size])
print ('> training --- epoch=%d/%d' % (e, n_epochs))
if e > 0 and e % 2000 == 0:
self.model.save('%s/models/gan_model_%d_.h5'%(BASE, e))
PS:我是Gans的新手,如果我做错了什么,请纠正我。目录中的
flow\u
方法用于fit\u生成器
功能。fit_generator
功能允许您指定纪元数
model.fit_generator(trn, epochs=epochs)
其中,
model
指的是要训练的模型对象。应该能解决你的问题。这些函数在Keras文档中有很好的解释您始终可以在fit\u generator
方法中指定steps\u per\u epoch
参数。这将使您能够在每个历元执行步骤时重复数据。
>总样本数//批次大小。要了解问题,首先,您需要从\u目录了解流的参数<代码>批量大小
确定要加载以进行计算的样本数,历元
确定要通过所有数据的次数。本质上,如果您设置了epoch=2
和batch\u size=32
,这意味着Keras将对您的所有数据进行两次检查,将您的数据拆分为mini batch
和32个数据样本。那么代码中缺少的基本上是epoch参数。
我建议也设置每个历元的步骤和验证数据。steps\u per\u epoch
确定了每个epoch中的批数,而不是访问每个epoch中的所有样本,如下所示设置steps\u per\u epoch
model.fit_generator(train_generator, steps_per_epoch=train_generator.samples/train_generator.batch_size, epochs=10, validation_data=validation_generator, validation_steps=validation_generator.samples/validation_generator.batch_size)
我发现了一个方法,使第二个生成器使用较少的图像来“重置”其索引,从而输出一批32个图像,而不是您前面提到的6个图像 看看你的代码,我想
trn\u real
是图像较多的生成器,而trn\u dist
是图像较少的生成器。在每次迭代中,比较批次形状,如果它们不相等(意味着生成器到达索引的末尾,因此输出较少的图像),然后按如下方式重置生成器:
real_images = trn_real.next()
dist_images = trn_dist.next()
if real_images.shape != dist_images.shape:
trn_dist.reset() # reset the generator with lesser images
dist_images = trn_dist.next()
我正在尝试训练一个GAN,其中来自两个源的输入被连接并调整大小,然后传递给一个模型,这样我一次只能处理批处理。所以没有办法从目录中设置flow_中的repeat模式吗?感谢您的澄清,我正在尝试训练一个GAN,其中一批图像必须传递给模型。因此,我使用n_时代的循环,而不是使用fit_生成器。请查找更新的代码。