2017-08-21 90 views
5

Aşağıdaki kodla NLP görevi için keraslarda basit bir model eğitimi alıyorum. Değişken isimleri tren, test ve doğrulama seti için kendini açıklayıcıdır. Bu veri kümesinin 19 sınıfı vardır, bu nedenle ağın son katmanının 19 çıkışı vardır. Etiketler de bir-sıcak kodlanmış.Keras: model.evaluate vs model.predict çoklu sınıf NLP görevinde doğruluk farkı

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) 

ilk dönemin ardından, bu beni bu çıkışlar verir.

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

Daha sonra, modelimi test veri kümesi üzerinde değerlendiriyorum ve bu da bana 0,98 civarında bir doğruluk gösteriyor. I karışıklık matris vb yüzden kullanımı oluşturmak, böylece

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

Bununla birlikte, etiketler, tek sıcak kodlanır, bu yüzden

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

Bu, toplam tahmin edilen sınıfları göstermektedir sınıfların tahmini vektör mi % 83 doğruluk vardı, ancak model1.evaluate% 98 doğruluk gösteriyor! Burada neyi yanlış yapıyorum? Kayıp işlevim kategorik sınıf etiketleriyle tamam mı? Tahmin katmanı için seçtiğim sigmoid aktivasyon fonksiyonu tamam mı? ya da kerasın bir modeli değerlendirmesinde farklılık var mı? Lütfen neyin yanlış olabileceğini önerin. Bu benim derin bir model yapmak için ilk denememdir, bu yüzden burada neyin yanlış olduğunu anlamadım.

+1

Kullan 'kullanarak kategorik ve ikili hem doğruluk alabilirsiniz 'softmax'' ve'' yerine ' 'sigmoid'' ve'' binary_crossentropy'' ait categorical_crossentropy''. İkinci ikisini kullanarak, sorunu çok-dilli bir problem olarak ele alıyorsunuz, çok-sınıf bir problem değil. –

+0

Cevabınız için teşekkür ederiz. Bunu deneyeceğim ve buna göre güncellenecektir. –

cevap

7

Sorunu buldum. metrics=['accuracy'], maliyet fonksiyonundan otomatik olarak doğruluk hesaplar. Yani binary_crossentropy kullanarak ikili doğruluğu, kategorik doğruluk gösterir. categorical_crossentropy kullanımı otomatik olarak kategorik doğruluğa geçer ve şimdi model1.predict() kullanarak manuel olarak hesaplananla aynıdır. Yu-Yang, çok-sınıflı problem için maliyet fonksiyonunu ve aktivasyon fonksiyonunu belirtmekte haklıydı.

P.S.: Tek metrics=['binary_accuracy', 'categorical_accuracy']

+0

Harika yakalama (+1) - ne yazık ki, bu sorunu yeniden keşfetmem ve anlamak zorundaydım - bkz. Https://stackoverflow.com/questions/41327601/why-is-binary-crossentropy-more-accurate-than- kategorik-crossentropy-for-multi/46004661 # 46004661 ve https://stackoverflow.com/questions/42081257/keras-binary-crossentropy-vs-categorical-crossentropy-performance/46038271#46038271 - yine de, bağlantıya verilen yanıtları güncelledim sizinkine... – desertnaut