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.
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. –
Cevabınız için teşekkür ederiz. Bunu deneyeceğim ve buna göre güncellenecektir. –