Как Tensorflow & Keras go от однократного кодированного вывода до прогнозирования класса для расчета точности? - PullRequest
1 голос
/ 02 мая 2020

Мне интересно, как метрики точности в TensorFlow / Keras рассчитывают, соответствует ли данный вход ожидаемый прогноз или, другими словами, как он определяет прогнозируемое число net.


Пример 1:

Вывод: [0, 0, 0.6], ожидаемый вывод: [0, 0, 1]

Я предполагаю, что 0,6 просто округляется до 1, правильно? Или оно рассматривается как единственное число больше 0,5, следовательно, это предсказанное число.

Но, если это так, то рассмотрим Пример 2:

Вывод: [0.6, 2, 0.1], ожидаемый вывод: [1, 0, 0]

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

Является ли здесь сейчас только наибольшее число, «извлеченное» и принятое в качестве предсказания? Итак, 2, что было бы неверным прогнозом.

Пример 3:

Вывод: [0.1, 0, 0.2], ожидаемый вывод: [0, 0, 1]

Поскольку каждое число в выходных данных меньше 0,5, я предполагаю, что калькулятор точности будет видеть этот вывод как [0, 0, 0], поэтому также не является правильным прогнозом. Это правильно?


Если мои предыдущие предположения верны, то будет ли правило следующим образом?

Каждое число меньше 0.5 является 0 с точки зрения предсказания и из чисел больше 0.5 или равных 0.5 я выбираю наибольшее. Наибольшее значение тогда представляет прогнозируемый класс.


Если это так, то точность можно использовать только для классификаций только с одним соответствующим правильным классом (например, не может быть ожидаемого результата, такого как [1, 0, 1])

Ответы [ 2 ]

3 голосов
/ 02 мая 2020

Есть несколько вопросов с вашим вопросом.

Для начала нам нужно уточнить точную настройку; так, в мультиклассовой классификации с одной меткой (т. е. выборка может принадлежать одному и только одному классу) с выборками с горячим кодированием (и прогнозами), все примеры, которые вы здесь показываете, являются Неправильно : элементы выходного массива не только меньше 1, но они должны добавить до 1 (поскольку они рассматриваются как вероятности).

Поняв это, легко увидеть, что нет необходимости устанавливать пороговое значение для любого значения (например, до 0,5, как вы предлагаете здесь); вы просто берете argmax. Таким образом, [0.25. 0.35. 0.4] становится [0, 0, 1].

Из этого примера также должно быть очевидно, что при такой настройке могут быть случаи, когда ни один отдельный элемент не превышает 0,5, и это очень естественно , Кажется, что новые практики склонны к путанице, что 0.5 играет здесь особую роль, как и в двоичной классификации; но в мультиклассовой классификации 0.5 больше не играет никакой особой роли; Эквивалентный «порог» в настройках мультикласса (для одной метки) равен 1/n, где n - количество классов (в данном примере 0,33, поскольку у нас есть 3 класса). Легко видеть, что, учитывая ограничение, что элементы массива должны быть меньше 1 и добавляя до 1, всегда будет одна запись больше 0,33. Но простое использование argmax сделает работу без необходимости промежуточного порогового значения.

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

Пока мы продолжаем обсуждение до значимых настроек классификации (а не просто проводим некоторые сумасшедшие вычислительные эксперименты), это не правильный; единственная другая возможная функция активации для классификации - sigmoid, которая снова даст результаты, меньшие 1 (но не более 1). Конечно, вы можете попросить linear (или даже relu) активацию в последнем слое; ваша программа не будет обрабатывать sh, но это не значит, что вы делаете что-то значимое с точки зрения моделирования, и, я надеюсь, это то, что вас здесь действительно интересует.

тогда точность может использоваться только для классификаций только с одним соответствующим правильным классом (например, не может быть ожидаемого результата, такого как [1, 0, 1])?

Это совершенно другой контекст в целом называется классификацией multi-label multi-label (т.е. образец может принадлежать более чем одному классу). Теперь должно быть ясно, что такие результаты, как [1, 0, 1], никогда не могут быть получены в случае одноклассового мультиклассового случая (т. Е. Если таких случаев уже нет в ваших истинных метках). См. Какова мера точности данных с несколькими метками? для общего случая и Как Keras обрабатывает классификацию с несколькими метками? (подсказка: с sigmoid).

1 голос
/ 02 мая 2020

Точность в Keras, используемая по умолчанию, является категориальной точностью, которая кажется подходящей для вас. Он вычисляет средний коэффициент точности по всем прогнозам для задач классификации мультикласса.

Код для него следующий:

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

Значение этого примера 1

[0, 0, 0.6]

будет

[0, 0, 1]

Пример 2

[0.6, 2, 0.1]

будет

[0, 1, 0]

Пример 3

[0.1, 0, 0.2]

будет

[0, 0, 1]

Затем они сравниваются с целями

[0, 0, 1], [1, 0, 0], [0, 0, 1] 

, и если вы прогнозируете, эти три примера дадут среднее из них, поэтому ваша точность будет

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