Я пытаюсь обучить Си-Эн-Эн классифицировать текст по темам. Когда я использую двоичную кросс-энтропию, я получаю точность ~ 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
чтобы сделать это. Также см. Определения категориальных и бинарных кроссентропий здесь .