Кажется, в понимании этого примера есть некоторые пробелы, которые необходимо заполнить первыми:
Если вы изучите этап подготовки данных (т. Е. Метод 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