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