2017-05-24 15 views
20

मैं अनिश्चित कैसे निम्नलिखित स्थिति में Keras के डिफ़ॉल्ट व्यवहार की व्याख्या करने के हूँ:केरास मल्टीलाबेल वर्गीकरण को कैसे संभालता है?

मेरे वाई (जमीनी सच्चाई) की MultilabelBinarizer() scikit-जानने का उपयोग कर स्थापित किया गया था।

इसलिए, एक यादृच्छिक उदाहरण देने के लिए, मेरे y कॉलम की एक पंक्ति एक-गर्म एन्कोडेड है: [0,0,0,1,0,1,0,0,0,0,1]

तो मेरे पास 11 कक्षाएं हैं जिनकी भविष्यवाणी की जा सकती है, और एक से अधिक सत्य हो सकते हैं; इसलिए समस्या की multilabel प्रकृति। इस विशेष नमूने के लिए तीन लेबल हैं।

मैं मॉडल को प्रशिक्षित करता हूं क्योंकि मैं एक गैर multilabel समस्या (सामान्य रूप से व्यापार) के लिए होगा और मुझे कोई त्रुटि नहीं है।

from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.optimizers import SGD 

model = Sequential() 
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1])) 
model.add(Dropout(0.1)) 
model.add(Dense(600, activation='relu')) 
model.add(Dropout(0.1)) 
model.add(Dense(y_train.shape[1], activation='softmax')) 

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', 
       optimizer=sgd, 
       metrics=['accuracy',]) 

model.fit(X_train, y_train,epochs=5,batch_size=2000) 

score = model.evaluate(X_test, y_test, batch_size=2000) 
score 

Keras क्या करें जब यह मेरे y_train का सामना करना पड़ता है और देखता है कि यह "बहु" एक गर्म इनकोडिंग है, जिसका अर्थ है y_train की प्रत्येक पंक्ति में एक से अधिक 'एक' वर्तमान करता है? असल में, क्या केरा स्वचालित रूप से मल्टीलाबेल वर्गीकरण करते हैं? स्कोरिंग मीट्रिक की व्याख्या में कोई अंतर?

उत्तर

29

कम

में softmax प्रयोग न करें।

अपनी आउटपुट परत के सक्रियण के लिए sigmoid का उपयोग करें।

हानि फ़ंक्शन के लिए binary_crossentropy का उपयोग करें।

मूल्यांकन के लिए predict का उपयोग करें।

क्यों

softmax में जब एक लेबल के लिए स्कोर में वृद्धि, सभी दूसरों को कम कर दिया जाता है (यह एक प्रायिकता वितरण है)। आप नहीं चाहते हैं कि जब आपके पास एकाधिक लेबल हों।

पूरा कोड

from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.optimizers import SGD 

model = Sequential() 
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1])) 
model.add(Dropout(0.1)) 
model.add(Dense(600, activation='relu')) 
model.add(Dropout(0.1)) 
model.add(Dense(y_train.shape[1], activation='sigmoid')) 

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='binary_crossentropy', 
       optimizer=sgd) 

model.fit(X_train, y_train, epochs=5, batch_size=2000) 

preds = model.predict(X_test) 
preds[preds>=0.5] = 1 
preds[preds<0.5] = 0 
# score = compare preds and y_test 
+1

धन्यवाद, तो आप कई द्विआधारी वर्गीकरण समस्याओं में मेरी multilabel समस्या विघटित कह रहे हैं? केरास कैसे जानता है कि मैं इसे एक मल्टीलाबेल वर्गीकरण कार्य दे रहा हूं? – user798719

+1

हां, यह सही है। केरास को वास्तव में पता नहीं है। 'सिग्मोइड 'और' बाइनरी_crossentropy' का उपयोग करके, लेबल अलग-अलग सुधार किए जाएंगे, और इस तरह आप मल्टीलाबेल कार्य के लिए चाहते हैं, है ना? – frankyjuang

+0

आपको कक्षाएं कैसे मिलेंगी जिनमें 1 है –

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