Saya mencoba melatih CNN untuk mengkategorikan teks berdasarkan topik. Ketika saya menggunakan cross-entropy biner saya mendapatkan akurasi ~ 80%, dengan cross-entropy kategoris saya mendapatkan akurasi ~ 50%.
Saya tidak mengerti mengapa ini terjadi. Ini masalah multikelas, bukankah itu berarti saya harus menggunakan cross-entropy kategoris dan bahwa hasil dengan binary cross-entropy tidak ada artinya?
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'))
Lalu saya mengkompilasinya seperti ini menggunakan categorical_crossentropy
fungsi loss:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
atau
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Secara intuitif masuk akal mengapa saya ingin menggunakan lintas-entropi kategoris, saya tidak mengerti mengapa saya mendapatkan hasil yang baik dengan biner, dan hasil yang buruk dengan kategorikal.
categorical_crossentropy
. Jika Anda memiliki dua kelas, mereka akan direpresentasikan sebagai 0, 1
dalam label biner dan 10, 01
dalam format label kategorikal.
Dense(1, activation='softmax')
untuk klasifikasi biner adalah salah. Ingat output softmax adalah distribusi probabilitas yang berjumlah satu. Jika Anda hanya ingin memiliki satu neuron output dengan klasifikasi biner, gunakan sigmoid dengan entropi silang biner.
categorical_crossentropy
. Label juga perlu dikonversi ke dalam format kategorikal. Lihatto_categorical
untuk melakukan ini. Juga lihat definisi crossentropies kategorikal dan biner di sini .