我正在使用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。

这些假设正确吗?

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

最佳答案

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

默认情况下,此值在32方法中设置为model.predict,但您可以指定其他方式(与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)

关于python - 我在Keras中正确理解batch_size吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55212576/

10-12 19:36