CNNをトレーニングして、テキストをトピックごとに分類しようとしています。バイナリクロスエントロピーを使用すると、最大80%の精度が得られます。カテゴリカルクロスエントロピーでは、最大50%の精度が得られます。
なぜなのかわかりません。これはマルチクラスの問題です。それは、カテゴリクロスエントロピーを使用する必要があり、バイナリクロスエントロピーを使用した結果は無意味であることを意味しませんか?
model.add(embedding_layer)
model.add(Dropout(0.25))
# convolution layers
model.add(Conv1D(nb_filter=32,
filter_length=4,
border_mode='valid',
activation='relu'))
model.add(MaxPooling1D(pool_length=2))
# dense layers
model.add(Flatten())
model.add(Dense(256))
model.add(Dropout(0.25))
model.add(Activation('relu'))
# output layer
model.add(Dense(len(class_id_index)))
model.add(Activation('softmax'))
次にcategorical_crossentropy
、損失関数として次のようにコンパイルします。
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
または
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
直観的には、カテゴリカルクロスエントロピーを使用する理由は理にかなっていますが、バイナリで良い結果が得られ、カテゴリで悪い結果が得られる理由がわかりません。
categorical_crossentropy
。2つのクラスがある場合、それらは0, 1
バイナリラベルおよび10, 01
カテゴリカルラベル形式で表されます。
Dense(1, activation='softmax')
バイナリ分類は単に間違っています。softmax出力は、合計が1になる確率分布であることを覚えておいてください。バイナリ分類の出力ニューロンを1つだけにする場合は、バイナリクロスエントロピーのシグモイドを使用します。
categorical_crossentropy
。また、ラベルはカテゴリー形式に変換する必要があります。to_categorical
これを行うには参照してください。ここでは、カテゴリおよびバイナリのクロスエントロピーの定義も参照してください。