Значения метрик равны при обучении и тестировании модели - PullRequest
0 голосов
/ 17 декабря 2018

Я работаю над моделью нейронной сети с python, используя Keras с бэкэндом TensorFlow.Набор данных содержит две последовательности с результатом, который может быть 1 или 0, а отношение положительных и отрицательных значений в наборе данных составляет от 1 до 9. Модель получает две последовательности в качестве входных данных и выдает вероятность.Сначала в моей модели был слой Dense с одним скрытым модулем и функцией активации сигмоида в качестве вывода, но затем я изменил последний слой модели на Dense с двумя скрытыми модулями и функцией активации softmax и изменил результат моего набора данных с помощью функции Keras to_categorical.После этих изменений метрики модели, которые содержат Точность, Точность, Напомним, F1, AUC, все равны и имеют высокое и неправильное значение.Вот реализация, которую я использовал для этих метрик

def recall(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def precision(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def f1(y_true, y_pred):
    precisionValue = precision(y_true, y_pred)
    recallValue = recall(y_true, y_pred)
    return 2*((precisionValue*recallValue)/(precisionValue+recallValue+K.epsilon()))

def auc(y_true, y_pred):
    auc = tf.metrics.auc(y_true, y_pred)[1]
    K.get_session().run(tf.local_variables_initializer())
    return auc

, а вот результат обучения

Epoch 1/5
4026/4026 [==============================] - 17s 4ms/step - loss: 1.4511 - acc: 0.9044 - f1: 0.9044 - auc: 0.8999 - precision: 0.9044 - recall: 0.9044
Epoch 2/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9087 - precision: 0.9091 - recall: 0.9091
Epoch 3/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9083 - precision: 0.9091 - recall: 0.9091
Epoch 4/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9090 - precision: 0.9091 - recall: 0.9091
Epoch 5/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9085 - precision: 0.9091 - recall: 0.9091

, после чего я протестировал свою модель, используя predict, и вычислил метрики, используя склерн precision_recall_fscore_support функция, и я снова получил тот же результат.все метрики равны и имеют высокое значение (0,93), что неверно на основании созданной мною путаницы enter image description here

Что я делаю неправильно?

1 Ответ

0 голосов
/ 17 декабря 2018

Начиная с точности Keras 2.0, Recall, F1 были удалены, потому что эти метрики должны быть рассчитаны глобально, но они рассчитывались в пакетном режиме. Ваш код похож на тот, который используется в keras 1.X, и это может бытьпроблема.

Попробуйте использовать пакет keras_metrics

import keras
import keras_metrics

model = models.Sequential()
model.add(keras.layers.Dense(1, activation="sigmoid", input_dim=2))
model.add(keras.layers.Dense(1, activation="softmax"))

model.compile(optimizer="sgd",
              loss="binary_crossentropy",
              metrics=[keras_metrics.precision(), keras_metrics.recall()])
...