मैं विषय द्वारा पाठ को वर्गीकृत करने के लिए एक सीएनएन को प्रशिक्षित करने की कोशिश कर रहा हूं। जब मैं बाइनरी क्रॉस-एंट्रोपी का उपयोग करता हूं तो मुझे ~ 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')
बाइनरी वर्गीकरण के लिए बस गलत है। याद रखें सॉफ्टमैक्स आउटपुट एक प्रायिकता वितरण है जो किसी एक को देता है। यदि आप बाइनरी वर्गीकरण के साथ केवल एक आउटपुट न्यूरॉन रखना चाहते हैं, तो बाइनरी क्रॉस-एंट्रोपी के साथ सिग्मॉइड का उपयोग करें।
categorical_crossentropy
। इसके अलावा लेबल को श्रेणीबद्ध प्रारूप में परिवर्तित करने की आवश्यकता है।to_categorical
ऐसा करने के लिए देखें । इसके अलावा यहाँ श्रेणीबद्ध और द्विआधारी क्रॉसेंट्रोपियों की परिभाषाएँ देखें ।