密集层的输入 0 与该层不兼容:输入形状的预期轴 -1 的值为 784,但接收到的输入形状为 (None, 14)

Posted

技术标签:

【中文标题】密集层的输入 0 与该层不兼容:输入形状的预期轴 -1 的值为 784,但接收到的输入形状为 (None, 14)【英文标题】:Input 0 of layer dense is incompatible with the layer: expected axis -1 of input shape to have value 784 but received input with shape (None, 14) 【发布时间】:2021-10-30 23:49:26 【问题描述】:

请帮帮我。谢谢

请查看图片以获取有关编码https://imgur.com/gallery/Oppnaq7的更多信息

所以请耐心等待...如果您知道解决方案,请提供帮助。谢谢

将 numpy 导入为 np 将熊猫导入为 pd 将张量流导入为 tf

from google.colab import files
uploaded = files.upload()

import io
df=pd.read_csv(io.BytesIO(uploaded['heart.csv']))

df

df.isna().sum(axis="rows")

from tensorflow.keras.utils import to_categorical

df.shape

y=df["cp"]

x=df.drop("cp",axis="columns")

y=to_categorical(y)

y.shape

x=pd.get_dummies(x,columns=["sex"])

x

df.hist(figsize=(10,10))
plt.show()

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

from keras.layers import Dense , Flatten
from keras.models import Sequential

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)])`

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

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

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

x

data=pd.DataFrame("age":[50],"trestbps":[120],"chol":[350],"fbs":[1],"restecg":[1],"thalach":[150],"exang":[0],"oldpeak":[1.5],"slope":[1],"ca":[0],"thal":[2],"target":[1],"sex_0":[0],"sex_1":[1])

data

model.predict(data)

我的老师在 jupyter 中使用了这个 cmd,但它不起作用...它点亮显示错误...在 colab n ju​​pyter 中都尝试过...

from keras.utils import to_categorical

y=to_categorical(y)

y.shape

X=X.drop(["PassengerId","Name","Ticket"],axis="columns")

X

X=pd.get_dummies(X,columns=["Sex"])

from keras.layers import Dense
from keras.models import Sequential

model=Sequential()
model.add(Dense(32,activation="relu",input_shape=(7,)))
model.add(Dense(2,activation="softmax"))

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

model.fit(X,y,epochs=10)

X

data=pd.DataFrame("Pclass":[3],"Age":[84],"SibSp":[0],"Parch":[1],"Fare":[7],"Sex_female":[0],"Sex_male":[1])

data

model.predict(data)

#Output array([[0.9702792 , 0.02972085]], dtype=float32)

【问题讨论】:

您在 MNIST 上训练了一个模型,是什么让您认为您可以预测与 MNIST 数据完全不同的数据?这没有任何意义。 那我该怎么办?你能告诉我 mnist 的解决方案吗...因为我知道除了 mnist 还可以使用什么...我老师教的东西不起作用 @Dr.Snoopy 如果你知道请提供解决方案...谢谢 如果您的代码显示错误,您需要告诉我们是哪个错误以及在哪里,我们无法猜测错误。 imgur.com/gallery/DMQmdY2 @Dr.Snoopy 我使用了tensorflow.keras.utils import to_categorical 而不是from keras.utils import to_categorical 因为它在谷歌搜索时显示错误n,它说keras.utilis不再工作......必须提前添加tensorflow跨度> 【参考方案1】:

查看你老师的 python 代码,错误告诉你 Dense 层期望输入数据具有 784 个特征,但得到的一系列数据只有 14 个特征。

通过查看您的 python 代码,我假设您在老师的代码中使用预定义的数据集 MNIST,如果我没记错的话,x_train 中的输入数据的形状为(784,x) 其中 x 是一个整数,可以是 3,4 等。

现在要解决这个问题,您必须了解如何将数据传递到模型中。再看看你老师的代码,我们有这个:

from keras.layers import Dense
from keras.models import Sequential

model=Sequential()
model.add(Dense(32,activation="relu",input_shape=(7,)))
model.add(Dense(2,activation="softmax"))

所以我们有一个包含两层的序列模型:

第一个 Dense 节点,也用作模型的 输入层,由 32 个单元组成,以 Rectified Linear Unit 作为激活函数,最重要的是,我们知道该模型的输入形状被写成 (7,) 的元组。那么这个值(7,)是多少?基本上,您是在告诉模型您的输入数据具有 7 个特征,因此每个数据必须包含 7 个值。 第二个密集节点只是输出层,它在输出中给出两个值之间的概率答案。这不太重要,因为您的问题是传递输入数据。

现在要了解如何在 Keras/Tensorflow 中处理数据,您必须将数据表示为矩阵,其中行中包含数据的值,而列表示值的含义。有点像 Excel/CSV 文件,其中有一个标题来解释每列中值的含义。

如果您曾经使用过 NumPy,更具体地说是 维数组,基本上数据的 形状 是在将数据提供给模型之前应该检查的最重要的事情,因为形状告诉您如何处理数据以及数据表示的维度。例如,如果您的数据具有 (784,14) 的形状,则数据表示为二维 (2D) 矩阵,其中第一个值 (784) 是矩阵的行,而第二个值 (14) 是列.

因此,为了回答您的问题,python 程序期望输入一系列包含 784 个特征的数据,对我来说,这些数据被转换为 784 列,但您输入的却是一系列只有 14 个特征的数据。所以要解决这个问题,你必须检查数据的形状,你可以简单地用x_train.shape 来做,然后在输出中查看你得到的结果。接下来,您必须将数据正确传递给模型,然后您的程序才能确定运行。一种方法是重塑数据。

要更好地了解 Tensorflow 如何处理数据的形状,请查看guide。

我建议你的另一件事是以更合适的方式写你的问题。我的建议是这样写一个问题:

问题的标题。 问题描述。 显示您遇到的错误。 写下您尝试过的内容,并添加对您其他类似问题的引用。 始终显示至少一段代码,以便人们对其进行分析。也可以接受更多的代码。 (可选)写下您想要的预期结果。

如果你这样写问题,人们肯定会更好地理解你的问题。

我希望这有助于更好地理解您的问题。

【讨论】:

以上是关于密集层的输入 0 与该层不兼容:输入形状的预期轴 -1 的值为 784,但接收到的输入形状为 (None, 14)的主要内容,如果未能解决你的问题,请参考以下文章

conv2d 层的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 1,但接收到形状为 [None, 64, 64, 3] 的输入

层 lstm_9 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 2, 4000, 256]

ValueError:层顺序的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 3,但接收到的输入具有形状

ValueError:lstm_45 层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,无,无,128)

ValueError:conv2d 层的输入 0 与层不兼容::预期 min_ndim=4,发现 ndim=3。收到的完整形状:(256、256、256)

DNN 中的错误:层序贯_10 的输入 0 与层不兼容