Ich versuche, ein CNN zu trainieren, um Text nach Themen zu kategorisieren. Wenn ich binäre Kreuzentropie verwende, erhalte ich eine Genauigkeit von ~ 80%, bei kategorialer Kreuzentropie eine Genauigkeit von ~ 50%.
Ich verstehe nicht, warum das so ist. Es ist ein Problem mit mehreren Klassen. Bedeutet das nicht, dass ich eine kategoriale Kreuzentropie verwenden muss und dass die Ergebnisse mit binärer Kreuzentropie bedeutungslos sind?
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'))
Dann kompiliere ich es entweder so oder benutze es categorical_crossentropy
als Verlustfunktion:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
oder
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Intuitiv macht es Sinn, warum ich kategoriale Kreuzentropie verwenden möchte. Ich verstehe nicht, warum ich mit binären Ergebnissen gute und mit kategorialen schlechte Ergebnisse erhalte.
categorical_crossentropy
. Wenn Sie zwei Klassen haben, werden diese wie 0, 1
in binären Beschriftungen und 10, 01
im kategorialen Beschriftungsformat dargestellt.
Dense(1, activation='softmax')
für die binäre Klassifizierung ist einfach falsch. Denken Sie daran, dass die Softmax-Ausgabe eine Wahrscheinlichkeitsverteilung ist, die sich zu eins summiert. Wenn Sie nur ein Ausgangsneuron mit binärer Klassifizierung haben möchten, verwenden Sie Sigmoid mit binärer Kreuzentropie.
categorical_crossentropy
. Auch Beschriftungen müssen in das kategoriale Format konvertiert werden. Sehen Sieto_categorical
, um dies zu tun. Siehe auch Definitionen von kategorialen und binären Crossentropien hier .