Sto cercando di formare una CNN per classificare il testo per argomento. Quando utilizzo l'entropia incrociata binaria ottengo un'accuratezza dell'80% circa, con un'entropia incrociata categorica un'accuratezza del 50% circa.
Non capisco perché questo sia. È un problema multiclasse, non significa che devo usare l'entropia incrociata categorica e che i risultati con l'entropia incrociata binaria sono insignificanti?
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'))
Quindi lo compilo in questo modo usando categorical_crossentropy
come funzione di perdita:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
o
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Intuitivamente ha senso il motivo per cui vorrei usare l'entropia incrociata categorica, non capisco perché ottengo buoni risultati con i binari e scarsi risultati con i categorici.
categorical_crossentropy
. Se hai due classi, saranno rappresentate come 0, 1
in etichette binarie e 10, 01
in formato di etichetta categoriale.
Dense(1, activation='softmax')
per la classificazione binaria è semplicemente sbagliato. Ricorda che l'output di softmax è una distribuzione di probabilità che si somma a una. Se vuoi avere un solo neurone in uscita con classificazione binaria, usa sigmoid con entropia binaria binaria.
categorical_crossentropy
. Anche le etichette devono essere convertite nel formato categoriale. Vedereto_categorical
per fare questo. Vedi anche le definizioni di crossentropie categoriche e binarie qui .