2017-08-21 27 views
5

मैं निम्नलिखित कोड के साथ एनएलपी कार्य के लिए केरे में एक साधारण मॉडल प्रशिक्षण दे रहा हूं। ट्रेन, परीक्षण और सत्यापन सेट के लिए परिवर्तनीय नाम आत्म व्याख्यात्मक हैं। इस डेटासेट में 1 9 वर्ग हैं इसलिए नेटवर्क की अंतिम परत में 1 9 आउटपुट हैं। लेबल भी एक गर्म एन्कोडेड हैं।केरास: मॉडल.अवलुएट बनाम मॉडल.predict बहु-वर्ग एनएलपी कार्य में सटीकता अंतर

nb_classes = 19 
model1 = Sequential() 
model1.add(Embedding(nb_words, 
        EMBEDDING_DIM, 
        weights=[embedding_matrix], 
        input_length=MAX_SEQUENCE_LENGTH, 
        trainable=False)) 
model1.add(LSTM(num_lstm, dropout=rate_drop_lstm, recurrent_dropout=rate_drop_lstm)) 
model1.add(Dropout(rate_drop_dense)) 
model1.add(BatchNormalization()) 
model1.add(Dense(num_dense, activation=act)) 
model1.add(Dropout(rate_drop_dense)) 
model1.add(BatchNormalization()) 

model1.add(Dense(nb_classes, activation = 'sigmoid')) 


model1.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
#One hot encode all labels 
ytrain_enc = np_utils.to_categorical(train_labels) 
yval_enc = np_utils.to_categorical(val_labels) 
ytestenc = np_utils.to_categorical(test_labels) 

model1.fit(train_data, ytrain_enc, 
      validation_data=(val_data, yval_enc), 
      epochs=200, 
      batch_size=384, 
      shuffle=True, 
      verbose=1) 

पहले युग के बाद, यह मेरे इन outputs देता है।

Epoch 1/200 
216632/216632 [==============================] - 2442s - loss: 0.1427 - acc: 0.9443 - val_loss: 0.0526 - val_acc: 0.9826 

फिर मैं परीक्षण डेटासेट पर अपने मॉडल का मूल्यांकन करता हूं और यह मुझे 0.98 के आसपास शुद्धता भी दिखाता है।

model1.evaluate(test_data, y = ytestenc, batch_size=384, verbose=1) 

हालांकि, लेबल एक गर्म इनकोड, तो मैं वर्गों की भविष्यवाणी वेक्टर की जरूरत है ताकि मैं भ्रम मैट्रिक्स आदि तो मैं का उपयोग उत्पन्न कर सकते हैं,

PREDICTED_CLASSES = model1.predict_classes(test_data, batch_size=384, verbose=1) 
temp = sum(test_labels == PREDICTED_CLASSES) 
temp/len(test_labels) 
0.83 

इससे पता चलता है कि कुल की भविष्यवाणी की कक्षाएं 83% सटीक थे हालांकि model1.evaluate 98% सटीकता दिखाता है !! मुझसे यहां क्या गलत हो रहा है? क्या मेरा नुकसान फ़ंक्शन क्लासिकल क्लास लेबल्स के साथ ठीक है? भविष्यवाणी परत के लिए sigmoid सक्रियण फ़ंक्शन की मेरी पसंद क्या है? या कैरस मॉडल का मूल्यांकन करने के तरीके में अंतर है? कृपया गलत क्या हो सकता है पर सुझाव दें। यह गहरी मॉडल बनाने की मेरी पहली कोशिश है, इसलिए मुझे यहां क्या गलत है इसकी समझ नहीं है।

+1

उपयोग 'का उपयोग करके दोनों स्पष्ट और बाइनरी सटीकता प्राप्त कर सकते हैं 'softmax'' और'' ' 'sigmoid'' और'' binary_crossentropy'' के बजाय categorical_crossentropy''। बाद वाले दो का उपयोग करके, आप समस्या को मल्टीलाबेल समस्या के रूप में देख रहे हैं, मल्टीक्लास समस्या नहीं। –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैं इसे आज़माउंगा और तदनुसार अपडेट करूंगा। –

उत्तर

7

मुझे समस्या मिली है। metrics=['accuracy'] लागत फ़ंक्शन से स्वचालित रूप से सटीकता की गणना करता है। इसलिए binary_crossentropy का उपयोग बाइनरी सटीकता दिखाता है, स्पष्ट सटीकता नहीं। categorical_crossentropy का उपयोग स्वचालित रूप से स्पष्ट सटीकता पर स्विच करता है और अब यह model1.predict() का उपयोग करके मैन्युअल रूप से गणना के समान है। यू-यांग बहु-वर्ग की समस्या के लिए लागत कार्य और सक्रियण समारोह को इंगित करने का अधिकार था।

पी.एस: एक metrics=['binary_accuracy', 'categorical_accuracy']

+0

ग्रेट कैच (+1) - दुर्भाग्य से, मुझे इस समस्या को फिर से खोजना और समझना था - https://stackoverflow.com/questions/41327601/why-is-binary-crossentropy-more-accurate-than- स्पष्ट-क्रॉसेंट्रॉपी-फॉर-मल्टी/46004661 # 46004661 और https://stackoverflow.com/questions/42081257/keras-binary-crossentropy-vs-categorical-crossentropy-performance/46038271#46038271 - फिर भी, मैंने लिंक के मेरे उत्तरों को अपडेट किया तुम्हारे लिए... – desertnaut

संबंधित मुद्दे