检查输入时出错:预期flatten_input
的形状为(28, 28)
,但数组的形状为(28, 3)
我正在尝试将单个图像与tensorflowbegınnerMNIST上可用的启动程序tensorflow项目进行比较
答案 0 :(得分:0)
您的Flatten
层采用28x3的数组,但是期望使用28x28的数组。逻辑上可能是您的图层将28x28像素的图像作为28x28的数组拍摄,但是您的数据具有28x3的形状。您需要将输入数组变成28x28数组。相反,您可以尝试将第一层input_shape
更改为(28, 3)
。
编辑:
您的代码中有两个问题。首先,分析以下代码行:
tf.keras.layers.Flatten(input_shape=(28, 28))
在这里,您期望输入28x28单色图像阵列(黑白)。因此,为此,我使用cv2
做下一个:
img = cv2.imread("./image.png", cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (28, 28))
之前,图像的形状为28x28x3(其中3是RGB通道)。使用cv2.IMREAD_GRAYSCALE
,我们得到了带有单色通道的28x28。但是,我们需要将每个像素值除以255.0,以使每个值介于0和1之间。
img = img/255.0
就我而言,image.png
是白色背景手写数字。为了使这一点更准确,我将颜色反转了。
现在,您获得了格式正确的预测数据。但是还有另一个问题。
result = model.predict_classes(img)
正如您在model.layers[0].input_shape
中看到的那样,您的Flatten
层需要一个(None,28,28)参数。 None
是数据集成员的数量。如果选中x_train.shape
,将得到(60000,28,28),其中第一个数字是数据集的大小。
好吧,要解决该问题,您只需要执行下一个:
result = model.predict_classes(img.reshape(1, 28, 28))
现在可以了。