Keras中的输入和输出维度错误

我目前正在处理一个关于客户流失管理的二分类问题。

在拟合模型时遇到了一个错误。似乎是输入/输出中的某些问题导致了这个错误,但我一直没能找出具体原因。

以下是我的代码(df包含我从中创建向量的数据框):

#删除不重要的列del df['RowNumber']del df['CustomerId']del df['Surname']

然后,我需要转换两个分类变量:

#转换并为分类变量创建虚拟变量df["Gender"] = df["Gender"].astype('category')df["Geography"] = df["Geography"].astype('category')df['Gender'] = pd.get_dummies(df['Gender'])df['Geography'] = pd.get_dummies(df['Geography'])y = df.iloc[:, -1] #标签变量X = df.iloc[:, :10] #特征

将数据集拆分为测试集和训练集:

# 将数据集拆分为训练集和测试集from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

接下来,我对变量进行缩放处理:

from sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)print(X_train.shape) #(8000, 10)print(X_test.shape) #(2000, 10)print(y_train.shape)#(8000,)print(y_test.shape)#(2000,)

构建网络:

model = models.Sequential()model.add(layers.Dense(32, activation='relu', input_shape=(8000,)))model.add(layers.Dense(1, activation='sigmoid'))# 编译神经网络model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])#拟合我们的模型model.fit(X_train, y_train, batch_size = 10, epochs = 10)# 预测测试集结果y_pred = classifier.predict(X_test)y_pred = (y_pred > 0.5)# 创建混淆矩阵from sklearn.metrics import confusion_matrixcm = confusion_matrix(y_test, y_pred)

我遇到的具体错误代码是:

ValueError: Error when checking input: expected dense_47_input to have shape (None, 8) but got array with shape (8000, 10)

如果能得到解决这个问题的帮助,将不胜感激!

编辑:model.summary在model.compile之前:enter image description here

编辑2:model.summary在编译之后:enter image description here


回答:

我想你需要修改这部分:

model.add(layers.Dense(32, activation='relu', input_shape=(10,)))

10 是你使用的特征数量。Keras 会自动处理批次/数据集中的行数。

编辑说明

from keras import modelsfrom keras import layersmodel = models.Sequential()model.add(layers.Dense(32, input_shape=(10,)))model.add(layers.Dense(1))

在这里,第一个层被创建,它将只接受一个维度为10的2D张量(零维度,即批次维度,是未指定的,因此可以接受任何值)。

因此,这个层只能连接到一个上游层,该层期望其输入为32维向量。在使用Keras时,你不必担心兼容性,因为你添加到模型中的层会动态构建以匹配传入层的形状。

第二个层没有接收到输入形状参数——它自动推断其输入形状为之前层的输出形状。

解码模型中的参数值:

假设这是我的模型:

from keras import modelsfrom keras import layersmodel = models.Sequential()model.add(layers.Dense(32, input_shape=(2,)))model.add(layers.Dense(1))model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])print model.summary()

这是模型摘要:

_________________________________________________________________Layer (type)                 Output Shape              Param #=================================================================dense_1 (Dense)              (None, 32)                96_________________________________________________________________dense_2 (Dense)              (None, 1)                 33=================================================================Total params: 129Trainable params: 129Non-trainable params: 0_________________________________________________________________

对于Dense层,我们需要计算这个:

output = dot(W, input) + b

或者

output = relu(dot(W, input) + b) #这里的relu是激活函数

在这个表达式中,W和b是层的张量属性。它们被称为层的“权重”或“可训练参数”(分别是内核和偏置属性)。这些权重包含网络从训练数据中学习到的信息。

对于第一层(参数=96)= 隐藏单元数 * 输入数据维度 + 偏置值

96 = 32 (隐藏单元) * 2 (数据维度) + 32 (偏置值与隐藏单元数相同)

对于第二层(参数=33)= 隐藏单元数 * 数据维度 + 偏置值

33 = 1 (隐藏单元) * 32 (数据维度) + 1 (偏置值与隐藏单元数相同)总参数 = 96+33 = 129

希望这对你有帮助 🙂

说明来源: Keras 文档

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注