我是否正确理解了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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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