Próbuję wytresować CNN do kategoryzowania tekstu według tematu. Kiedy używam binarnej entropii krzyżowej, uzyskuję ~ 80% dokładności, przy kategorycznej entropii krzyżowej uzyskuję ~ 50% dokładności.
Nie rozumiem, dlaczego tak jest. Jest to problem wieloklasowy, czy nie oznacza to, że muszę używać kategorycznej entropii krzyżowej i że wyniki z binarną entropią krzyżową są bez znaczenia?
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'))
Następnie kompiluję go w ten sposób, używając categorical_crossentropy
jako funkcji utraty:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
lub
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Intuicyjnie ma sens, dlaczego chciałbym użyć kategorycznej entropii krzyżowej, nie rozumiem, dlaczego uzyskuję dobre wyniki w przypadku binarności i słabe wyniki w kategoriach.
categorical_crossentropy
. Jeśli masz dwie klasy, będą one reprezentowane jako 0, 1
etykiety binarne oraz 10, 01
w formacie etykiety kategorialnej.
Dense(1, activation='softmax')
klasyfikacja binarna jest po prostu błędna. Pamiętaj, że wynik softmax to rozkład prawdopodobieństwa, który sumuje się do jednego. Jeśli chcesz mieć tylko jeden neuron wyjściowy z klasyfikacją binarną, użyj sigmoidy z binarną entropią krzyżową.
categorical_crossentropy
. Etykiety również muszą zostać przekonwertowane na format kategoryczny. Zobacz, jakto_categorical
to zrobić. Zobacz także definicje jakościowych i binarnych krzyżówek tutaj .