Tensorflow 如何使用Keras中的\u目录中的流\u重复数据

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,

我正在尝试使用keras从目录中流动来训练模型。但它不会重复 历元之后的数据(即当所有数据都已迭代时)。我找不到 也可以选择这样做。下面是我在培训期间生成数据的代码。 例如,如果总图像数=70 批量大小=32 然后在第一次和第二次迭代中,is给出了32幅图像,但在第三次迭代中,它给出了6幅图像

# 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_生成器。请查找更新的代码。