Керас оценивать () и прогнозировать () результаты слишком далеко - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю над моделью двоичной классификации с использованием керас.См. Данные, приведенные ниже

print(train_x.shape) --(79520,)
print(test_x.shape) --(26507,)
print(train_y.shape) --(79520,)
print(test_y.shape) --(26507,)

Я использую LSTM, активация - «сигмоидальная», а «binary_crossentrophy» - моя функция потерь.

input_layer = layers.Input((100,))
embedding_layer = layers.Embedding(20001, 100)(input_layer)
lstm_layer = layers.Bidirectional(CuDNNLSTM(64,return_sequences=True))(embedding_layer)
pooling_layer = layers.GlobalMaxPool1D()(lstm_layer)
op_layer = layers.Dense(50, activation='relu')(pooling_layer)
op_layer = layers.Dropout(0.5)(op_layer)
op_layer = layers.Dense(1, activation = 'sigmoid')(op_layer)
model = models.Model(inputs=input_layer, outputs=op_layer)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 100)               0         
_________________________________________________________________
embedding_1 (Embedding)      (None, 100, 100)          2000100   
_________________________________________________________________
bidirectional_1 (Bidirection (None, 100, 128)          84992     
_________________________________________________________________
global_max_pooling1d_1 (Glob (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 50)                6450      
_________________________________________________________________
dropout_1 (Dropout)          (None, 50)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 51        
=================================================================
Total params: 2,091,593
Trainable params: 2,091,593
Non-trainable params: 0
_________________________________________________________________

В конце 10 эпох точность обучения равна0,97 и точность проверки составляет около 0,72.

model.fit(train_x, train_y, epochs=10, batch_size=10, validation_split = 0.1)

 Train on 71568 samples, validate on 7952 samples
Epoch 1/10
71568/71568 [==============================] - 114s 2ms/step - loss: 0.6014 - acc: 0.6603 - val_loss: 0.5556 - val_acc: 0.7006
Epoch 2/10
71568/71568 [==============================] - 107s 1ms/step - loss: 0.4921 - acc: 0.7573 - val_loss: 0.5449 - val_acc: 0.7194
Epoch 3/10
71568/71568 [==============================] - 107s 1ms/step - loss: 0.3918 - acc: 0.8179 - val_loss: 0.5924 - val_acc: 0.7211
Epoch 4/10
71568/71568 [==============================] - 107s 2ms/step - loss: 0.3026 - acc: 0.8667 - val_loss: 0.6642 - val_acc: 0.7248
Epoch 5/10
71568/71568 [==============================] - 107s 1ms/step - loss: 0.2363 - acc: 0.8963 - val_loss: 0.7322 - val_acc: 0.7271
Epoch 6/10
71568/71568 [==============================] - 107s 2ms/step - loss: 0.1939 - acc: 0.9155 - val_loss: 0.8349 - val_acc: 0.7150
Epoch 7/10
71568/71568 [==============================] - 107s 2ms/step - loss: 0.1621 - acc: 0.9292 - val_loss: 1.0337 - val_acc: 0.7226
Epoch 8/10
71568/71568 [==============================] - 107s 1ms/step - loss: 0.1417 - acc: 0.9375 - val_loss: 0.9998 - val_acc: 0.7221
Epoch 9/10
71568/71568 [==============================] - 107s 1ms/step - loss: 0.1273 - acc: 0.9433 - val_loss: 1.1732 - val_acc: 0.7197
Epoch 10/10
71568/71568 [==============================] - 107s 1ms/step - loss: 0.1138 - acc: 0.9481 - val_loss: 1.1462 - val_acc: 0.7222

scores = model.evaluate(test_x,test_y, verbose=1)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

26507/26507 [==============================] - 5s 183us/step
acc: 72.45%

Кажется, что до этого момента все хорошо, и все идет на юг, когда я запускаю функцию предиката () для тестовых данных

pred=model.predict(test_x)
pred=pred.argmax(axis=-1)
print(accuracy_score(pred,test_y)*100)

43.48285358584525

from sklearn.metrics import confusion_matrix
confusion_matrix(test_y, pred)

array([[11526,     0],
       [14981,     0]])

Я не в состоянии понять, почему оценки () и предсказания () слишком далеко.Можете ли вы указать, что не так?Я запускаю это на GPU EC2.Ниже приведена версия программного обеспечения.

Keras 2.2.4 Tensorflow 1.12.0

Дайте мне знать, если вам нужны другие подробности о модели.Спасибо

1 Ответ

0 голосов
/ 21 февраля 2019

Тот факт, что ваши acc и val_acc настолько далеко друг от друга, говорит о том, что ваша модель сильно перегружена тренировками.Вообще говоря, вы хотите иметь модель, в которой acc и val_acc расположены близко друг к другу.Хуже всего то, что разница между loss и val_loss впечатляет, а val_loss нестабильна и увеличивается по мере того, как эксперимент продвигается по эпохам.Это тот тип вещей, который вы хотели бы найти при обучении модели.Стоит потратить немного времени на изучение переподготовки и неполной подготовки и того, как справляться с этими ситуациями.

Более того, точность, как правило, является слабой метрикой для задач двоичной классификации, поэтому она не может быть хорошейОснова для обучения модели в первую очередь.Вместо этого лучше использовать что-то вроде f1-показателя, если только ваши истинные и ложные метки не близки к 50/50.Вы можете найти отзыв, точность и f1 для Keras здесь .

...