【问题标题】:How to fix: ValueError: Error when checking input: expected flatten_input to have 3 dimensions, but got array with shape (28, 28)如何修复:ValueError:检查输入时出错:预期 flatten_input 为 3 维,但得到的数组形状为 (28, 28)
【发布时间】:2019-08-08 01:31:18
【问题描述】:

我正在尝试将自己的图像输入到 mnist 模型中

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)

model.evaluate(x_test, y_test)
model.predict(gray)

灰色是形状为 (28,28) 的图像,但我收到一条错误消息,指出模型需要 3 维,即使输入形状为 (28,28)。

如果我执行 gray.reshape(1,28,28),则代码有效,但我不知道为什么会有效,或者这是否是解决此问题的正确方法。

【问题讨论】:

    标签: python python-3.x tensorflow


    【解决方案1】:

    model 实例需要一批图像。这是在这一行指定的:

    tf.keras.layers.Flatten(input_shape=(28, 28))
    

    当您指定 input_shape=(28, 28) 时,您基本上是在告诉 Tensorflow 您将收到一批输入,其中批次中的每个元素都将具有 28 x 28 的形状。因此,当您添加图片时,请确保扩大其尺寸:

    gray = np.expand_dims(gray, axis=0)
    

    那么,你可以放心地做:

    model.predict(gray)
    

    此外,在这种特殊情况下,您可以使用np.reshape。但是,该方法有不同的用途,所以我会坚持使用np.expand_dims。这是证明它们相等的证据:

    X = np.random.rand(28, 28)
    np.testing.assert_array_equal(np.expand_dims(X, axis=0), np.reshape(X (1, 28, 28)))
    # The assert passes
    

    【讨论】:

    • gray.reshape(1,28,28) 做同样的事情吗?
    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多