J'essaie de former un CNN à catégoriser le texte par sujet. Lorsque j'utilise l'entropie croisée binaire, j'obtiens une précision d'environ 80%, avec une entropie croisée catégorique, j'obtiens une précision d'environ 50%.
Je ne comprends pas pourquoi. C'est un problème multiclasse, cela ne signifie-t-il pas que je dois utiliser une entropie croisée catégorique et que les résultats avec une entropie croisée binaire n'ont aucun sens?
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'))
Ensuite, je le compile soit comme ceci en utilisant categorical_crossentropy
comme fonction de perte:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
ou
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Intuitivement, il est logique que je veuille utiliser l'entropie croisée catégorielle, je ne comprends pas pourquoi j'obtiens de bons résultats avec des résultats binaires et des résultats médiocres avec des résultats catégoriques.
categorical_crossentropy
. Si vous avez deux classes, elles seront représentées sous 0, 1
forme d'étiquettes binaires et 10, 01
au format d'étiquette catégorielle.
Dense(1, activation='softmax')
car la classification binaire est tout simplement fausse. Rappelez-vous que la sortie softmax est une distribution de probabilité qui se résume à un. Si vous souhaitez n'avoir qu'un seul neurone de sortie avec une classification binaire, utilisez un sigmoïde avec une entropie croisée binaire.
categorical_crossentropy
. Les étiquettes doivent également être converties au format catégoriel. Voyezto_categorical
pour faire cela. Voir également les définitions des crossentropies catégoriques et binaires ici .