簡體   English   中英

我不斷收到 ValueError: Shapes (10, 1) and (10, 3) are incompatible when training my model

[英]I keep getting ValueError: Shapes (10, 1) and (10, 3) are incompatible when training my model

當我調用 makeModel 時,將輸入數量從 3 變為 1 可以讓程序無錯誤地運行,但實際上沒有進行任何訓練,並且准確性不會改變。

import pandas as pd
from numpy import loadtxt
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.preprocessing import LabelEncoder
from sklearn.utils import shuffle
from sklearn.tree import DecisionTreeRegressor as dtr
from sklearn.metrics import mean_absolute_error as mae
import numpy as np

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='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.fit(train_X, train_y, epochs=10, batch_size=10)

    return model

label_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損失所期望的 one-hot 編碼方案。 如果您有 integer 編碼,則必須使用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 model

label_encoder = LabelEncoder()
iris = datasets.load_iris()
y = iris.target
y = 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM