我有一个简单的密集型NN,其中有2个用Keras编写的输入值,在Tensorflow和Python上运行。我已经成功安装了该网,并且可以进行评估而不会出错。但是,当我要预测单个样本数据的结果时,由于输入数据的尺寸形状不正确,会出现错误。但是,当我打印numpy数组的形状时,它将返回正确的形状:
inputArr = np.array((x[sample][0], x[sample][1]))
print(inputArr)
print(inputArr.shape)
prediction = model.predict(inputArr)
这将产生以下输出:
Input data: [-1. -1.]
Array shape: (2,)
随后出现错误:
Traceback (most recent call last):
File ".\train3d.py", line 60, in <module>
prediction = model.predict(inputArr)
File "C:\Users\svoja\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\engine\training.py", line 1147, in predict
x, _, _ = self._standardize_user_data(x)
File "C:\Users\svoja\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\engine\training.py", line 749, in _standardize_user_data
exception_prefix='input')
File "C:\Users\svoja\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\engine\training_utils.py", line 137, in standardize_input_data
str(data_shape))
ValueError: Error when checking input: expected dense_1_input to have shape (2,) but got array with shape (1,)
从错误消息中可以看到,网络期望一个尺寸为(2,)的数组,该数组与我的输入数组的输出完全相同。
我的问题是,数组到底有什么问题?
答案 0 :(得分:2)
您缺少批处理大小,Keras希望数据隐式(N, D)
,其中N是批处理大小,D是要素数量。对于您的情况D=2
,但您没有矩阵。
要传递单个数据点,您需要形状(1, 2)
,该形状将读取具有2个特征的1个数据点。您可以通过以下方式实现此目标:
inputArr = np.array((x[sample][0], x[sample][1]))
print(inputArr) # [-1, -1]
print(inputArr.shape) # (2,)
inputArr = np.expand_dims(inputArr, 0)
print(inputArr.shape) # (1, 2)
或更短的语法糖版本:
inputArr = inputArr[None, :] # (1, 2)
其中None
添加了新的维度。