【发布时间】:2018-09-17 19:33:00
【问题描述】:
我在 keras 中使用带有 fit_generator 的数据生成器(用于训练和验证数据)。 我得到了意想不到的结果,所以我对生成器进行了检测,以输出批处理索引并计算自上一个 epoch 以来的步数。我已将 ['acc'] 添加到模型指标中。
当 fit_generator 运行时,我看到它做了几件事:
- 它将验证数据排队(但我猜它还没有评估)。
- 它遍历所有训练数据并调用 on_epoch_end()
- 它调用另外 10 个步骤的训练数据。我认为这必须来自回调。它在做什么?
- 完成验证数据的迭代并调用on_epoch_end()
- 它调用另外 10 个步骤的验证数据。再说一遍,它在做什么?
- fit_generator 打印训练/验证损失和准确性并返回。
on_epoch_end() 在 3 和 5 的 10 步之后永远不会被调用。这可能是一个错误,因为我们需要在下一个 epoch 之前重置生成器。
我主要想了解第 3 步和第 5 步发生了什么——为什么要调用生成器,为什么只调用十步?
Versions:
print(keras.__version__)
2.2.2
print(tf.__version__)
1.9.0
【问题讨论】:
-
这不是错误,默认情况下,keras 使用生成器输出的缓存,因此它们在不同的线程中被调用,因此生成器和训练循环彼此并行运行。这就是你所看到的。
-
所以如果我理解正确的话,它是下一个时代的预排队数据。但是,当下一个纪元运行时,我看到生成器被称为 len(generator) 次。所以在再次调用 on_epoch_end 之前,生成器最终被调用了 N+10 次。
-
这不应该发生,您使用的是 Sequence 类吗?这是确保并行代码中的竞争条件不会在 Keras 中发生的唯一方法。没有它,就会有重复的批次。
-
我正在使用序列,但让我验证我的声明。 :-) 我有 multiprocessing=False,我有工人设置为 1。
-
好的,我认为这里的问题是我为每个时期独立调用 fit_generator,因此我可以评估早期停止指标。我需要在再次调用 fit_generator 之前重置生成器。
标签: tensorflow keras