Estou tentando treinar uma CNN para categorizar o texto por tópico. Quando uso entropia cruzada binária, obtenho ~ 80% de precisão, com entropia cruzada categórica recebo ~ 50% de precisão.
Eu não entendo por que isso é. É um problema multiclasse, isso não significa que eu tenho que usar entropia cruzada categórica e que os resultados com entropia cruzada binária não têm sentido?
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'))
Então eu compilei assim usando esta categorical_crossentropy
função de perda:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
ou
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Intuitivamente, faz sentido o motivo pelo qual eu gostaria de usar a entropia cruzada categórica, não entendo por que obtenho bons resultados com binários e maus resultados com categóricos.
categorical_crossentropy
. Se você tiver duas classes, elas serão representadas como 0, 1
em rótulos binários e 10, 01
em formato de rótulo categórico.
Dense(1, activation='softmax')
pois a classificação binária está simplesmente errada. Lembre-se de que a saída do softmax é uma distribuição de probabilidade que resume a um. Se você deseja ter apenas um neurônio de saída com classificação binária, use sigmoide com entropia cruzada binária.
categorical_crossentropy
. Os rótulos também precisam ser convertidos para o formato categórico. Vejato_categorical
para fazer isso. Veja também definições de entropia cruzada categórica e binária aqui .