2

私はKerasでマルチクラス分類のグリッド検索をしようとしています。ここでは、コードのセクションです:GridClock 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.shape[1]を変更してください、あなたの 'のいくつかのサンプルを表示することができますy_train_onehot'と元の 'y'?元の 'y'を' y_onehot'に変換したコード。 –

+0

@VivekKumar、あなたの提案通りに追加しました。 –

+1

シンプルなマルチクラスの問題のようです。 'y_'というワンホットエンコードはしないでください。 'fit()'で直接使用してください: 'grid.fit(X_train、y_train)' –

答えて

2

エラーはsoftmaxレイヤーにあります。同じことをしてみてください

  1. :これは奇妙ですが、あなたの第二の問題はy_train_onehotているように見える、あなたは2つのことをしようとする気になり:

    私はアップデート1あなたがy_train_onehot.shape[1]代わりのy_train_onehot[1]

    を意味だと思いますモデルなしy_trainのonehotエンコーディングそれだけでは動作しない場合は、sparse_categorical_crossentropy

損失を変更

  • また、ソフトマックス層

  • +1

    ありがとうございました。あなたの最初の提案は働いた –

    +0

    私は同様の問題を抱えています。非ホットエンコードに戻すことは、動作しないその他のあらゆる問題(例えば、最後のsoftmaxをレイヤー1にレイヤーを設定するなど)を生成するように見えます。ありがとう! – romanovzky