【问题标题】:Do I understand batch_size correctly in Keras?我在 Keras 中正确理解了 batch_size 吗?
【发布时间】:2019-08-08 07:15:45
【问题描述】:

我正在使用 Keras 的内置 inception_resnet_v2 来训练 CNN 来识别图像。在训练模型时,我有一个 numpy 数据数组作为输入,输入形状为 (1000, 299, 299, 3),

 model.fit(x=X, y=Y, batch_size=16, ...) # Output shape `Y` is (1000, 6), for 6 classes

起初,在尝试预测时,我传入了一个形状为 (299, 299, 3) 的图像,但得到了错误

ValueError: 检查输入时出错:预期 input_1 有 4 个维度,但得到的数组的形状为 (299, 299, 3)

我重塑了我的输入:

x = np.reshape(x, ((1, 299, 299, 3)))

现在,当我预测时,

y = model.predict(x, batch_size=1, verbose=0)

我没有收到错误消息。

我想确保我在训练和预测中都能正确理解batch_size。我的假设是:

1) 使用model.fit,Keras 从输入数组中获取batch_size 元素(在这种情况下,它一次处理我的 1000 个示例 16 个样本)

2) 使用model.predict,我应该将输入重新整形为单个 3D 数组,并且我应该将 batch_size 显式设置为 1。

这些假设是否正确?

另外,向模型提供训练数据是否会更好(甚至可能),这样就不需要在预测之前进行这种重塑?感谢您帮助我了解这一点。

【问题讨论】:

    标签: python tensorflow machine-learning keras conv-neural-network


    【解决方案1】:

    不,你的想法错了。 batch_size 指定一次通过网络“转发”多少数据示例(通常使用 GPU)。

    默认情况下,该值在model.predict 方法中设置为32,但您可以另外指定(就像您对batch_size=1 所做的那样)。由于这个默认值,你得到了一个错误:

    ValueError:检查输入时出错:预期 input_1 有 4 尺寸,但得到了形状为 (299, 299, 3) 的数组

    不应该以这种方式重塑您的输入,而是为它提供正确的批量大小。

    说,对于默认情况,您将传递一个形状为(32, 299, 299, 3) 的数组,类似于不同的batch_size,例如对于batch_size=64,此函数需要您传递形状为(64, 299, 299, 3 的输入。

    编辑:

    您似乎需要将您的单个样本重新整形为一批。我建议您使用np.expand_dims 来提高代码的可读性和可移植性,如下所示:

    y = model.predict(np.expand_dims(x, axis=0), batch_size=1)
    

    【讨论】:

    • 谢谢——我差不多明白了,但你是说因为我用形状(1000、299、299、3)训练了我的网络,它期望model.predict 的批量大小为 1000?由于我一次只预测一张图像,我应该使用不同的model.fit batch_size 1 重新训练吗?
    • 否,默认情况下,它期望批量大小为32。它与训练的批量模型无关。只需指定batch_size 等于1,在您的predict 方法中,根据我收集到的信息,不幸的是,您需要执行重塑。
    • 更新了我的答案,现在应该没问题了,抱歉打扰了。
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2012-01-27
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多