Keras model.fit 仅使用 batch_size 和仅使用 steps_per_epoch 之间的区别



当我同时使用batch_sizesteps_per_epoch参数运行model.fit时,我收到以下错误:

ValueError: If steps_per_epoch is set, the `batch_size` must be None.

因此,从此错误和keras模型(函数式API(的以下文档中

batch_size:整数或无。每次梯度更新的样本数。如果 未指定,batch_size将默认为 32。

steps_per_epoch:整数或无。总步骤数(样品批次( 在宣布一个纪元结束并开始下一个纪元之前。训练时 对于输入张量(如 TensorFlow 数据张量(,默认值 None 等于数据集中的样本数除以批量大小,如果无法确定,则等于 1。

我知道这两个参数在某种程度上是等效的。但是,在我的笔记本电脑上(使用带有 2GB VRAM 的 GeForce 940M 显卡并训练 cifar10 数据集(当我运行 epochs 参数设置为 256 的model.fit时,脚本运行良好,keras 给出的反馈如下所示:

4608/50000 [=>............................] - ETA: 1:59 - loss: 0.8167 - acc: 0.7398

更新第一个数字总是增加 256 个单位。但是,当将steps_per_epoch作为number_train//batch_size传递时,我内存不足,除非我batch_size传递为 1,否则无法运行我的脚本。

那么,model.fit如何使用这些参数呢?当我只使用其中一个而不是另一个时有什么区别?

这是个好问题。我从源代码([1] 和 [2](中观察到的是:

  • 设置batch_size时,训练数据将切片为此大小的批次(参见 L184(。
  • 当你设置steps_per_epoch时,如果训练输入不是框架原生张量(这是最常见的情况(,整个训练集将分批馈入网络(参见L152(,这就是你得到内存错误的原因。

因此,基于实现,我建议仅在通过框架原生张量(即第一维为批量大小的 TensorFlow 张量(馈送时steps_per_epoch使用参数,这确实是一项要求。为此,需要将参数xymodel.fit设置为None

最新更新