Оценка нейронной сети с использованием точности в модели Keras

В Keras при обучении и оценке модели нейронной сети (классифицируйте два класса (0 и 1)) модель возвращает потери и точность как для обучения, так и для тестирования:

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])

В чем выражается эта точность? Это средняя точность для двух классов или точность для одного из двух классов?


person ryh12    schedule 28.06.2017    source источник


Ответы (2)


Точность — это количество правильно классифицированных образцов, деленное на количество всех образцов. Это не требует какой-либо точности для каждого класса.

Вот, например, код, который Керас использует для вычисления двоичной точности:

K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
person sietschie    schedule 28.06.2017
comment
stackoverflow.com/questions/47680984/ - person Dexter; 07.12.2017

Keras будет выбирать из списка возможных метрик в своем коде. Из исходного кода метрики есть пять возможностей:

def binary_accuracy(y_true, y_pred):
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)

def categorical_accuracy(y_true, y_pred):
    return K.cast(K.equal(K.argmax(y_true, axis=-1),
    K.argmax(y_pred, axis=-1)),
    K.floatx())

def sparse_categorical_accuracy(y_true, y_pred):
    return K.cast(K.equal(K.max(y_true, axis=-1),
    K.cast(K.argmax(y_pred, axis=-1), K.floatx())),
    K.floatx())

def top_k_categorical_accuracy(y_true, y_pred, k=5):
    return K.mean(K.in_top_k(y_pred, K.argmax(y_true, axis=-1), k), axis=-1)

def sparse_top_k_categorical_accuracy(y_true, y_pred, k=5):
    return K.mean(K.in_top_k(y_pred, K.cast(K.max(y_true, axis=-1), 'int32'), k), axis=-1)

Выбор зависит от типа модели и функции потерь. В модуле обучения он выбирает функция точности:

if (output_shape[-1] == 1 or self.loss_functions[i] == losses.binary_crossentropy):
    # case: binary accuracy
    acc_fn = metrics_module.binary_accuracy

elif self.loss_functions[i] == losses.sparse_categorical_crossentropy:
    # case: categorical accuracy with sparse targets
    acc_fn = metrics_module.sparse_categorical_accuracy

else:
    acc_fn = metrics_module.categorical_accuracy

В вашей модели у вас есть 2 выхода и categorical_crossentropy потери, поэтому вы попадете в случае 3, и ваша точность будет:

def categorical_accuracy(y_true, y_pred):
    return K.cast(K.equal(K.argmax(y_true, axis=-1),
    K.argmax(y_pred, axis=-1)),
    K.floatx())

При переводе ваша модель ожидает, что только один класс будет истинным, если индекс прогнозируемого класса с максимальным значением равен индексу истинного класса, он считается правильным.

Пример:

  • предсказано: [0,7; 0.3] /// правда: [1 ; 0] --- считается правильным
  • предсказано: [0,8; 0,2] /// правда: [0 ; 1] --- считается неправильным
person Daniel Möller    schedule 28.06.2017
comment
stackoverflow.com/questions/47680984/ - person Dexter; 07.12.2017