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