Точность и частота ошибок примера сиамской сети в Керасе - PullRequest
0 голосов
/ 11 апреля 2020

Я следовал этому примеру здесь , и я хочу знать, как именно работает эта функция точности:

def compute_accuracy(y_true, y_pred):
'''Compute classification accuracy with a fixed threshold on distances.
'''
    pred = y_pred.ravel() < 0.5
    return np.mean(pred == y_true)

Насколько мне известно, выход сети в этом случае будет расстояние между двумя парами. Итак, как мы можем рассчитать точность в этом случае? К чему относится пороговое значение «0,5»? Кроме того, как я могу рассчитать коэффициент ошибок?

1 Ответ

1 голос
/ 13 апреля 2020

Кажется, в понимании этого примера есть некоторые пробелы, которые необходимо заполнить первыми:

Если вы изучите этап подготовки данных (т. Е. Метод create_pairs), вы поймете, что положительные пары (т. е. парам отсчетов, принадлежащих к одному и тому же классу) присваивается метка 1 (т. е. положительный / истинный), а отрицательным парам (т. е. парам отсчетов, принадлежащих к разным классам) присваивается метка 0 (т. е. отрицательный / ложный).

Кроме того, сиамская сеть в этом примере спроектирована так, что, учитывая пару выборок в качестве входных данных, она будет прогнозировать их расстояние в качестве выходных данных. Используя контрастную потерю в качестве функции потерь модели, модель обучается так, что при наличии положительной пары в качестве входных данных прогнозируется небольшое значение расстояния (поскольку они принадлежат к одному классу и, следовательно, их расстояние должно быть низким, т.е. сходство) и с учетом отрицательной пары в качестве входных данных прогнозируется большое значение расстояния (потому что они принадлежат разным классам и, следовательно, их расстояние должно быть большим, то есть для передачи различий). В качестве упражнения попытайтесь подтвердить эти точки, рассматривая их численно (т. Е. Когда y_true равно 1, а когда y_true равно 0), используя контрастное определение потерь в коде.

Итак, функция точности в Пример реализован таким образом, что фиксированный произвольный порог , т. е. 0,5, применяется к прогнозируемым значениям расстояния, т. е. y_pred (это означает, что автор этого примера решил, что значения расстояния менее 0,5 указывают положительные пары ; вы можете решить использовать другое пороговое значение, но это должен быть разумный выбор, основанный на эксперименте / опыте). Затем результат будет сравниваться с истинными значениями меток, то есть y_true:

  • Когда y_pred меньше 0,5 (y_pred < 0.5 будет равно True): если y_true равно 1 (т. Е. Положительное), то это означает, что прогноз сети соответствует истинной метке (т. Е. True == 1 равен True), и, следовательно, прогноз для этой выборки засчитывается в правильные прогнозы (т. Е. Точность ). Однако, если y_true равно 0 (то есть отрицательно), то прогноз для этой выборки неверен (то есть True == 0 равен False), и, следовательно, это не будет способствовать правильному предсказанию.

  • Когда y_pred равно или больше 0,5 (y_pred < 0.5 будет равно False): применимо то же рассуждение, что и выше (оставлено как упражнение!).

( Примечание: не забывайте, что модель обучается на пакетах выборок. Следовательно, y_pred или y_true не являются одним значением; скорее, они являются массивами значений, и все перечисленные выше вычисления / сравнения применяются поэлементно).

Давайте рассмотрим (воображаемый) числовой пример для входной партии из 5 пар выборок и то, как рассчитывается точность для прогнозов модели на этой основе. партия:

>>> y_pred = np.array([1.5, 0.7, 0.1, 0.3, 3.2])
>>> y_true = np.array([1, 0, 0, 1, 0])

>>> pred = y_pred < 0.5
>>> pred
array([False, False,  True,  True, False])

>>> result = pred == y_true
>>> result
array([False,  True, False,  True,  True])

>>> accuracy = np.mean(result)
>>> accuracy
0.6
...