fit_generator中的Keras steps_per_epoch如何工作

时间:2017-10-18 23:16:16

标签: python machine-learning keras

在Keras文档中 - steps_per_epoch:在声明一个纪元完成并开始下一个纪元之前从生成器产生的步骤(样本批次)的总数。它通常应等于数据集的唯一样本数除以批量大小。

我有3000个样本。 如果我设置steps_per_epoch = 3000,它的工作会很慢。如果我设置steps_per_epoch = 300它的工作速度更快,我认为批处理工作!

但后来我比较了在第一种和第二种情况下分配了多少视频内存。并没有注意到一个很大的区别。如果我使用简单的 fit()函数,则差异很大。所以这是真正的加速,或者我只处理300个例子,而不是3000?

这个参数需要什么?我怎样才能加快培训速度? 我的生成器代码:

def samples_generator(self, path_source, path_mask):
    while 1:
        file_paths_x = self.get_files(path_source)
        file_paths_y = self.get_files(path_mask)
        for path_x, path_y in zip(file_paths_x, file_paths_y):
            x = self.load_pixels(path_x, 3, cv2.INTER_CUBIC)
            y = self.load_pixels(path_y, 0, cv2.INTER_NEAREST)
            yield (x, y)

1 个答案:

答案 0 :(得分:5)

steps_per_epoch参数是完成一个完整纪元所需的样本批次数。这取决于您的批量大小。批量大小设置在初始化训练数据的位置。例如,如果您使用ImageDataGenerator.flow()ImageDataGenerator.flow_from_directory()执行此操作,则会在每个参数中使用batch_size参数指定批量大小。

你说你有3000个样本。

  • 如果批量大小为100,那么steps_per_epoch将为30。
  • 如果您的批量大小为10,那么steps_per_epoch将为300.
  • 如果您的批量大小为1,那么steps_per_epoch将为3000.

这是因为steps_per_epoch应该等于样本总数除以批量大小。在Keras中实现此目的的过程可在以下两个视频中找到。

您必须设置steps_per_epoch的原因是生成器设计为无限期运行(请参阅docs

  

"期望生成器无限期地循环其数据。"

)。您通过设置while 1来实现此目的。 由于fit_generator()应该运行epochs=x次,因此该方法必须知道下一个纪元何时在此无限循环内开始(因此,必须再次从头开始绘制数据)。