深層学習のパラメータを最適化するためにグリッドサーチを用いたのですが、そこで問題が起きました。
初めはあるデータを5クラスに分類する問題です。以下のようにモデルを作成しました
param_grid = {
"activation": ["relu", "tanh", "sigmoid", ],
"learning_rate": [0.0001, 0.001, 0.01],
"units": [64, 128, 256, 512],
"drop_rate":[0.2, 0.02, 0.5, 0.3],
}
def mlp(activation="relu", learning_rate=0.001,units=64, drop_rate = 0.2):
model = Sequential()
model.add(Dense(units=units, input_dim=41))
model.add(Activation(activation))
model.add(Dropout(drop_rate))
model.add(BatchNormalization())
model.add(Dense(units=units))
model.add(Activation(activation))
model.add(Dropout(drop_rate))
model.add(BatchNormalization())
model.add(Dense(units=units))
model.add(Activation(activation))
model.add(Dropout(drop_rate))
model.add(BatchNormalization())
model.add(Dense(units=5))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.SGD(lr=learning_rate),
metrics=['accuracy',])
return model
そして以下のように学習をさせて行きます。
model = KerasClassifier(build_fn=mlp, nb_epoch=40, batch_size=10000, verbose=1)
clf = GridSearchCV(estimator=model, param_grid=param_grid, cv=4, scoring='accuracy')
res = clf.fit(X_train, y_train)
このように5クラスに分類させる時は問題なかったのですが、同じ教師データでさらに細かい分類にするためラベルをさらに細分化し、23クラスの分類にしました。model.add(Dense(units=5))の部分をmodel.add(Dense(units=23))として、新たにラベルだけ変えた教師データを使用したら以下のようなエラーが出ました。
ValueError: Error when checking target: expected activation_12 to have shape (None, 23) but got array with shape (123506, 24)
要は最後の層での行列の形が合わないという事な気がしたのですが、教師データをシャッフルしているうちにそのエラーが消えましたが、何エポックか進むとまた同じエラーが出ました。各データの個数に偏りがあることが原因かと思いましたが、エラーが出るのはこのパラメータ最適化の作業だけで、通常の学習時には、同じデータ、同じモデルなのに問題なくできます。これは何が原因なのでしょうか。。。?
追記です。
y_train.shapeは(164675,)、len(np.unique(y_train))は23です。
確かに教師データの方におかしいものがありました。それを直したら今度はValueError: Error when checking target: expected activation_4 to have shape (None, 23) but got array with shape (123505, 22)となってしまいました。また、これは教師データをシャッフルしているのですが、シャッフルしないと、ValueError: Error when checking target: expected activation_4 to have shape (None, 23) but got array with shape (123505, 16)となったりします。このデータには偏りがあり、かなり量が多いクラスと少ないクラスがあります。そのため、最初の学習で使用する時バッチサイズ分だけ教師データから選ばれると思うので、その時そこに含まれないクラスがあり23クラスあるはずが16しかないよ、となっているのでは?とも思いますがどうでしょうか?ただそれだとなぜ普通の学習時にはうまく行くのか疑問ですが。。。
回答2件
あなたの回答
tips
プレビュー