Я намагаюся навчити 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
. Якщо у вас є два класи, вони будуть представлені як 0, 1
у бінарних мітках, так і 10, 01
у категоричному форматі міток.
Dense(1, activation='softmax')
для двійкової класифікації просто неправильно. Пам'ятайте, що вихід softmax - це розподіл ймовірностей, який дорівнює одиниці. Якщо ви хочете мати лише один вихідний нейрон з бінарною класифікацією, використовуйте сигмоїд з бінарною перехресною ентропією.
categorical_crossentropy
. Також мітки потрібно перетворити на категоричний формат. Дивіться,to_categorical
щоб зробити це. Дивіться також визначення категоріального і бінарних crossentropies тут .