我是否正确理解了Keras中的batch_size?

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

 model.fit(x=X, y=Y, batch_size=16, ...) # 输出形状`Y`为(1000, 6),对应6个类别

起初,在尝试预测时,我传入了一个形状为(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个元素(在这种情况下,它会以每次16个样本的形式处理我的1000个例子)

2) 使用model.predict时,我应该将输入重塑为一个单一的3D数组,并且我应该明确将batch_size设置为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)

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注