Как реализовать точное соответствие / точность подмножества в качестве метрики для Keras? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь использовать точность совпадения / подмножества в качестве метрики для моей модели Keras.Я в основном понимаю, как это должно работать, но мне тяжело работать с тензорными манипуляциями.

Я работаю над задачей многоуровневой классификации с 55 возможными метками.Я считаю, что вывод> 0.5 будет положительным для этого ярлыка.Мне нужна метрика, которая описывает, как часто выходные данные точно соответствуют истинным меткам.

Мой подход заключается в преобразовании y_true в tf.bool и y_pred > 0.5 в tf.bool, а затем возвращении тензора, содержащегоTrue, если они точно совпадают, и False в противном случае.Похоже, что он работает, когда я делаю базовые тесты, но когда я тренирую модель, она остается на 0.0000 без каких-либо изменений.

def subset_accuracy(y_true, y_pred):
    y_pred_bin = tf.cast(y_pred > 0.5, tf.bool)
    equality = tf.equal(tf.cast(y_true, tf.bool), y_pred_bin)
    return tf.equal(
        tf.cast(tf.math.count_nonzero(equality), tf.int32),
        tf.size(y_true)
    )

Я ожидаю, что метрика будет медленно подниматься, даже если онатолько доходит до 50% или что-то.Но он остается на уровне 0.0.

1 Ответ

0 голосов
/ 24 июня 2019

Предложение: протестируйте свою метрику независимо от модели.Используйте модель (также нетренированный) и model.evaluate одну партию.Вычислите метрику вручную, используя выходные данные model.predict.

. Убедитесь, что ваши вычисления и метрика, выводимые моделью, имеют одинаковый результат и что результат имеет смысл для значений в этом пакете.

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

Из вашего фрагмента кода неясно, что вы считаете точным подмножеством.

Например, Keras определяет категориальную_акурацию как:

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,5?Возможно, вам стоит подумать об изменении метрики Keras.

...