python - ValueError:检查输入时出错:预期dense_1_input的形状为(9,)但得到的数组形状为(1,)
问题描述
嗨,所以我建立了一个 DNN 网络来使用对象的特征对图像中的一些对象进行分类,如下所示:
contours, _ = cv2.findContours(imgthresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for contour in contours:
features = np.array([])
(x_start, y_start, character_width, character_height) = cv2.boundingRect(contour)
x_end = x_start + character_width
y_end = y_start + character_height
character_area = character_width * character_height
features = np.append(features, [character_width, character_height, character_area, x_start,
y_start, x_end, y_end, image_width, image_height])
print(features)
print(features.shape)
cv2.rectangle(image, (x_start, y_start), (x_end, y_end), (0, 255, 0), thickness=1)
print(features)
输出是:
[ 5. 1. 5. 105. 99. 110. 100. 100. 117.]
并且print(features.shape)
是:
(9,)
我使用以下代码构建和训练了一个 DNN:
model = Sequential()
model.add(Dense(50, input_dim=9, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(40, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(30,activation='relu'))
model.add(Dense(2, activation='softmax'))
输入层有 9 个输入特征。所以我尝试使用以下方法获得模型的预测:
model.predict_classes(features)
训练数据,一个CSV
文件,包含 10 列(9 个特征和 1 个用于输出)
我收到以下错误:
ValueError: Error when checking input: expected dense_1_input to have shape (9,) but got array with shape (1,)
我尝试使用以下方法重塑特征数组:
np.reshape(features,(1,9)
但这也没有用。我还是这个领域的新手
解决方案
这是一个最小的工作示例。
import numpy as np
import tensorflow as tf
def main():
features = np.array([5, 1, 5, 105, 99, 110, 100, 100, 117])
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(50, input_dim=9, activation="relu"))
print(tf.expand_dims(features, 0))
print(np.reshape(features, (1, 9)))
print(model.predict_classes(np.reshape(features, (1, 9))))
if __name__ == '__main__':
main()
如您所见,np.reshape
调用使其起作用。它大致相当于tf.expand_dims
.
您当前的错误来自您的模型需要批量维度这一事实。因此,如果您将一个形状数组传递给它,(9,)
它会推断它是一批标量,而不是大小为 9 的单个数组。