2

我想爲Keras做一個多類分類的網格搜索。下面是一段代碼:GridSearch for MultiClass KerasClassifier

數據的一些屬性如下:

y_ 
array(['fast', 'immobile', 'immobile', ..., 'slow', 
     'immobile', 'slow'], 
     dtype='<U17') 

y_onehot = pd.get_dummies(y_).values 

y_onehot 
array([[1, 0, 0], 
     [0, 0, 1], 
     [0, 0, 1], 
    ... 
     [0, 1, 0], 
     [0, 0, 1], 
     [0, 1, 0]], dtype=uint8) 

#Do train-test split 

y_train.shape 
(1904,) 

y_train_onehot.shape 
(1904, 3) 

和模型...

# Function to create model, required for KerasClassifier 
def create_model(optimizer='rmsprop', init='glorot_uniform'): 
    # create model 
    model = Sequential() 
    model.add(Dense(2048, input_dim=X_train.shape[1], kernel_initializer=init, activation='relu')) 
    model.add(Dense(512, kernel_initializer=init, activation='relu')) 
    model.add(Dense(y_train_onehot.shape[1], kernel_initializer=init, activation='softmax')) 
    # Compile model 
    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) 
    return model 

# create model 
model = KerasClassifier(build_fn=create_model, verbose=0) 

# grid search epochs, batch size and optimizer 
optimizers = ['rmsprop', 'adam'] 
init = ['glorot_uniform', 'normal', 'uniform'] 
epochs = [50, 100, 150] 
batches = [5, 10, 20] 

param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init) 
grid = GridSearchCV(estimator=model, param_grid=param_grid, scoring='accuracy') 
grid_result = grid.fit(X_train, y_train_onehot) 

,這裏是錯誤:

--> grid_result = grid.fit(X_train, y_train_onehot) 
ValueError: Classification metrics can't handle a mix of multilabel-indicator and multiclass targets 

該代碼是爲二進制模型,但我希望修改它爲多類數據集。請協助。謝謝!

+0

你能表現出一些樣品你' y_train_onehot'和原始的'y'?以及將原始「y」轉換爲「y_onehot」的代碼。 –

+0

@VivekKumar,我已經按照你的建議添加了。 –

+1

它看起來像一個簡單的多類問題。請不要熱門編碼'y_'。直接在'fit()'中使用它:'grid.fit(X_train,y_train)' –

回答

2

錯誤發生在softmax層。

我想你指的y_train_onehot.shape[1]代替y_train_onehot[1]

更新1:這是奇怪,但你的第二個問題似乎y_train_onehot,您不介意嘗試兩件事情:

  1. 嘗試同樣的型號而不是 y_train上的onehot編碼。
  2. 如果不能單獨工作,損失更改爲sparse_categorical_crossentropy

同時一定要改變y_train_onehot.shape[1]到的類的數量在SOFTMAX層

+1

非常感謝。你的第一個建議起作用 –

+0

我有類似的問題,你可以更明確地告訴你已經嘗試過了嗎?恢復到非熱編碼似乎會產生各種其他問題,這些問題也不起作用(比如不得不將最後一個softmax設置爲第1層,等等)。謝謝! – romanovzky

相關問題