在训练我的模型时,我不断遇到 ValueError:形状 (10, 1) 和 (10, 3) 不兼容

当我将 makeModel 函数中的输入数量从 3 改为 1 时,程序可以无错误运行,但实际上没有进行训练,准确率也没有变化。

import pandas as pdfrom numpy import loadtxtfrom sklearn.impute import SimpleImputerfrom sklearn.model_selection import train_test_splitfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Densefrom sklearn.preprocessing import LabelEncoderfrom sklearn.utils import shufflefrom sklearn.tree import DecisionTreeRegressor as dtrfrom sklearn.metrics import mean_absolute_error as maeimport numpy as npdef makeModel(num_inputs, num_classes, train_X, train_y):    model = Sequential()    model.add(Dense(8, input_dim=num_inputs, activation='relu'))    model.add(Dense(10, activation='relu'))    model.add(Dense(10, activation='relu'))    model.add(Dense(10, activation='relu'))    model.add(Dense(3, activation='softmax'))    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])    model.fit(train_X, train_y, epochs=10, batch_size=10)    return modellabel_encoder = LabelEncoder()iris_data = pd.read_csv("iris.csv")iris_data = shuffle(iris_data)iris_data['species'] = label_encoder.fit_transform(iris_data['species'])feature_columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']X = iris_data[feature_columns]y = iris_data['species']train_x, val_x, train_y, val_y = train_test_split(X, y, test_size=0.2)iris_model = makeModel(4, 3, train_x, train_y)

回答:

LabelEncoder 将输入转换为编码值数组。例如,如果你的输入是 ["paris", "paris", "tokyo", "amsterdam"],它们可以被编码为 [0, 0, 1, 2]。这不是 categorical_crossentropy 损失函数所期望的一热编码方案。如果你使用的是整数编码,你需要使用 sparse_categorical_crossentropy

解决方法

将你的代码中的损失函数改为 sparse_categorical_crossentropy

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

示例

def makeModel(num_inputs, num_classes, train_X, train_y):    model = Sequential()    model.add(Dense(8, input_dim=num_inputs, activation='relu'))    model.add(Dense(10, activation='relu'))    model.add(Dense(10, activation='relu'))    model.add(Dense(10, activation='relu'))    model.add(Dense(3, activation='softmax'))    model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])    model.fit(train_X, train_y, epochs=10, batch_size=10)    return modellabel_encoder = LabelEncoder()iris = datasets.load_iris()y = iris.targety = label_encoder.fit_transform(y)train_x, val_x, train_y, val_y = train_test_split(iris.data, y, test_size=0.2)iris_model = makeModel(4, 3, train_x, train_y)

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中创建了一个多类分类项目。该项目可以对…

发表回复

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