【问题标题】:Difference between Keras model.fit using only batch_size and using only steps_per_epoch仅使用 batch_size 和仅使用 steps_per_epoch 的 Keras model.fit 之间的区别
【发布时间】:2018-10-21 07:40:52
【问题描述】:

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

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

所以,从这个错误和下面的文档from keras Model(functional API)

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

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

我知道这两个参数在某种程度上是等效的。但是,在我的笔记本电脑上,(使用 GeForce 940M 显卡和 2GB VRAM 并训练 cifar10 数据集)当我运行 model.fit 并将 epochs 参数设置为 256 时,脚本运行良好,并且来自 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 如何使用这些参数?当我只使用其中一种而不使用另一种时有什么区别?

【问题讨论】:

    标签: python machine-learning keras training-data


    【解决方案1】:

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

    • 当您设置batch_size 时,训练数据会被分割成这个大小的批次(参见L184)。
    • 当您设置steps_per_epoch 时,如果训练输入不是框架原生张量(这是最常见的情况),整个 训练集将被一次性输入网络(请参阅L152),这就是您收到内存错误的原因。

    因此,根据实现,我建议仅在通过框架原生张量(即第一维是批量大小的 TensorFlow 张量)提供参数时使用参数steps_per_epoch,这确实是一个要求。为此,model.fit 中的参数 xy 需要设置为 None

    【讨论】:

    • 因此,当我通过生成器将数据传递给模型并使用 fit_generator 函数时,我只有 steps_per_epoch 选项,因为当生成器产生一个元素时,“keras”会即时了解 batch_size ,对吗?
    • total_no_img = 50000 /n batch_size = 10 /n STEPS_PER_EPOCH = total_no_img / batch_size /n STEPS_PER_EPOCH = 50000 / 10 /n STEPS_PER_EPOCH = 5000 /n /n 内存还不够大? /n 这里我只从文件中读取 50000 条记录..我有 333000 个图像数据集
    猜你喜欢
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2021-02-23
    • 2017-11-12
    • 2018-10-15
    相关资源
    最近更新 更多