【问题标题】:The starting point of next epoch for fit_generator in KerasKeras 中 fit_generator 下一个 epoch 的起点
【发布时间】:2019-05-15 07:07:26
【问题描述】:

在 Keras 文档中,steps_per_epoch in fit_generator 表示:

在声明一个 epoch 完成并开始下一个 epoch 之前从生成器产生的步骤总数(样本批次)。

我想知道我是否有一个无限生成器,那么当我进入下一个 epoch 时我从哪里开始呢?我会在离开的地方捡起来吗?还是我要从第一个样本重新开始?

【问题讨论】:

  • 是的,Keras 不会在您的生成器中看到任何“结束”,它只会按顺序无限地选择 next(generator) 样本。

标签: machine-learning keras generator


【解决方案1】:

这取决于您的生成器的定义。实际上,如果你有一个生成器可以无限产生批次,那么你必须确保它被定义为在迭代所有样本(即一个时期)之后它会回到起点(即我们不会再生成一个样本)一个时代不止一次)。例如,这种生成器的粗略草图如下所示:

def my_gen(x_train, y_train, batch_size):
    n_samples = x_train.shape[0]
    n_steps = np.ceil(n_samples // batch_size)
    while True:
        # one epoch: goes over all the samples
        for i in range(n_steps):
            # the last batch might have less than batch_size samples
            if (i+1) * batch_size > n_samples:
                x = x_train[i * batch_size:]
                y = y_train[i * batch_size:]
            else:  
                x = x_train[i * batch_size : (i+1) * batch_size]
                y = y_train[i * batch_size : (i+1) * batch_size]
            yield x, y

【讨论】:

  • 我们以您的代码为例。如果 n_steps 为 100,batch_size 为 1,我在 fit_generator 中将 steps_per_epoch 设置为 32。当它完成第一个 epoch 并开始第二个 epoch 时,是从第 33 个样本开始还是从第 1 个样本重新开始?
  • @YixiangCai 如果n_steps=100 和batch_size=1 则样本数等于100。现在,如果您设置steps_per_epoch=32,则意味着每个epoch 生成32 个大小为1 的批次。因此,在第一个 epoch 完成后,它将从您提到的第 33 个样本开始。但是,您应该将steps_per_epoch 设置为等于样本数除以批量大小(因为n_steps 是在内部设置的)。通过这种方式,您可以确保您在一个 epoch 中准确地使用了一次所有样本(当然,考虑到生成器的定义如上所述)。
  • 非常感谢!这真的很有帮助!
猜你喜欢
  • 2021-05-27
  • 2019-09-16
  • 2019-04-27
  • 2020-03-16
  • 2017-12-30
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多