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

相关问题