ฉันพยายามฝึก 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 คือการกระจายความน่าจะเป็นที่รวมเป็นหนึ่ง หากคุณต้องการมีเซลล์ประสาทขาออกเพียงอันเดียวที่มีการจำแนกประเภทไบนารีให้ใช้ sigmoid พร้อมเลขฐานสองข้ามเอนโทรปี
categorical_crossentropy
คุณต้องใช้ ป้ายกำกับยังต้องแปลงเป็นรูปแบบเด็ดขาด มาดูto_categorical
กันเลย ยังเห็นคำจำกัดความของเด็ดขาดและ crossentropies ไบนารีที่นี่