繁体   English   中英

检查输入时出错:预期 flatten_input 有 4 个维度,但得到形状为 (404, 13) 的数组

[英]Error when checking input: expected flatten_input to have 4 dimensions, but got array with shape (404, 13)

import tensorflow as tf

from tensorflow import keras

import numpy as np

import matplotlib.pyplot as plt

data = keras.datasets.boston_housing

(x_train , y_train) , (x_test , y_test) = data.load_data()

model = keras.Sequential([

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

    keras.layers.Dense(128 , activation="relu"),

    keras.layers.Dense(10 , activation="softmax")
])

model.compile(optimizer="adam" , loss="sparse_categorical_crossentropy" , metrics=["accuracy"])

model.fit(x_train , y_train ,epochs=5 )

test_loss , test_acc = model.evaluate(x_test , y_test)

print("tested acc: ", test_acc)

Flatten层是将3D+张量变成2D。 我猜这个 model 是为二进制 MNIST 设计的,它具有不同的输入形状,并且您尝试在另一个数据集上使用它。 Boston Housing Dataset 已经有 2D 输入,所以在这里没有意义。 您可以通过更改输入形状来运行此程序,但这没有意义:

keras.layers.Flatten(input_shape=(13,)),

您所要做的就是将其删除,它会正常运行。 然后,您必须更改损失 function、指标和最终激活 function,因为您正在处理回归问题。 最终更正后的代码:

import tensorflow as tf

from tensorflow import keras

import numpy as np

import matplotlib.pyplot as plt

data = keras.datasets.boston_housing

(x_train , y_train) , (x_test , y_test) = data.load_data()

model = keras.Sequential([

    keras.layers.Dense(128 , activation="relu"),

    keras.layers.Dense(1)
])

model.compile(optimizer="adam" , loss="mae")

model.fit(x_train , y_train ,epochs=5 )

test_loss = model.evaluate(x_test , y_test)

print("test loss: ", test_loss)
 32/102 [========>.....................] - ETA: 0s - loss: 5.9563
102/102 [==============================] - 0s 682us/sample - loss: 6.7218

test loss:  6.721758244084377

Flatten用于使 2d 数据像图像一样平坦,所以基本上你在 1d 列表中转换 2d 列表,所以你应该将Flatten更改为Input

第二个错误是声明输入形状。

input_shape=(28 , 28 )

您声明了28x28 ,但我认为您想要 28 个样本和 28 个特征。 这是不变的。 为了正确地做到这一点,您将输入形状定义为灵活的,它将匹配训练和预测中的任意数量的样本。 您需要做的就是传递一个样本具有多少个特征

input_shape=(28, )

这是它应该的样子

model = keras.Sequential([

    keras.layers.Input(input_shape=(28, )),

    keras.layers.Dense(128 , activation="relu"),

    keras.layers.Dense(10 , activation="softmax")
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM