【问题标题】:I keep getting ValueError: Shapes (10, 1) and (10, 3) are incompatible when training my model我不断收到 ValueError: Shapes (10, 1) and (10, 3) are incompatible when training my model
【发布时间】:2020-11-30 01:30:36
【问题描述】:

将我调用 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)

【问题讨论】:

    标签: python tensorflow machine-learning scikit-learn deep-learning


    【解决方案1】:

    LabelEncoder 将输入转换为编码值数组。即如果您的输入是["paris", "paris", "tokyo", "amsterdam"],那么它们可以编码为[0, 0, 1, 2]。这不是categorical_crossentropy loss 所期望的one-hot 编码方案。如果您有整数编码,则必须使用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)
    

    【讨论】:

    • 这修复了它。所以如果使用整数编码,我使用 sparse_categorical_crossentropy,但是如果我使用 one-hot-encoding 那么我的损失函数应该是 categorical_crossentropy?我对 tensorflow 很陌生,所以谢谢!
    猜你喜欢
    • 2021-09-12
    • 2022-11-18
    • 2021-07-07
    • 2022-10-22
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多