首页 文章

使用Keras ValueError的多类分类:检查目标时出错:

提问于
浏览
-1

我正在尝试 Build 一个模型来预测房屋的损坏 . 我正在使用Keras .

在'damage_grade'栏中预测5个值在1到5之间 . 数字越大,房屋可以获得的伤害越大 .

另外我想提一下我是Keras的初学者,这是我在Keras的第一个模特 . 我试图通过Keras documentation的帮助来做到这一点 .

我的代码是:

X_train = rtrain_df.drop("damage_grade", axis=1) 
Y_train = rtrain_df["damage_grade"] 
X_test = rtest_df.drop("building_id", axis=1).copy() 
X_train.shape, Y_train.shape, X_test.shape

import keras 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.optimizers import SGD

model = Sequential() 
model.add(Dense(64, activation='relu', input_dim=46)) #there are 46 feature in my dataset to be trained 
model.add(Dropout(0.5)) 
model.add(Dense(64, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(10, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(X_train, Y_train, epochs=20, batch_size=128)

尝试拟合模型时,会出现以下错误:

ValueError:检查目标时出错:期望dense_6有形状(10,)但得到的形状为数组(1,)

有大约60万条记录需要培训

1 回答

  • 1

    您的代码中存在一些错误:

    • 你在最后一个Dense图层中给出了10 . 它必须等于要预测的值的数量,即5 .

    • 您必须将Y_train转换为具有5个分类要素的分类数组('damage_grade',从0到4) .

    以下是更正后的代码:

    X_train = rtrain_df.drop("damage_grade", axis=1) 
    Y_train = rtrain_df["damage_grade"] 
    X_test = rtest_df.drop("building_id", axis=1).copy() 
    X_train.shape, Y_train.shape, X_test.shape
    
    import keras 
    from keras.models import Sequential 
    from keras.layers import Dense, Dropout, Activation 
    from keras.optimizers import SGD
    
    from keras.utils import np_utils
    Y_train_cat = np_utils.to_categorical(Y_train) # converts into 5 categorical features
    
    model = Sequential() 
    model.add(Dense(64, activation='relu', input_dim=46))
    model.add(Dropout(0.5)) 
    model.add(Dense(64, activation='relu')) 
    model.add(Dropout(0.5)) 
    model.add(Dense(5, activation='softmax')) 
    
    # last Dense layer is the output layer that'll produce the probabilities for the 5 
    # outputs
    
    model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
    
    model.fit(X_train, Y_train_cat, epochs=20, batch_size=128)
    
    import numpy as np
    
    predictions = model.predict(X_test)
    result = np.argmax(predictions,axis=1) # sets the output with max probability to 1
    

相关问题