Вопрос или проблема
Я обучил свою модель с использованием функции потерь тройки, используя архитектуру FaceNet. Я использовал набор данных 11k hands. Теперь я хочу оценить, насколько хорошо работает моя модель, поэтому я подаю ей 2 изображения одного класса и получаю их эмбеддинги. Я хочу сравнить расстояние между этими эмбеддингами, и если это расстояние не больше определенного порога, я могу утверждать, что модель правильно классифицирует эти 2 изображения как принадлежащие одному классу.
Как мне выбрать значение порога?
Является ли значение порога тем же, что и гиперпараметр отступа, используемый в функции потерь тройки? (alpha = 0.2
)
Изучив код FaceNet и код OpenFace, я увидел, что они тестируют 400 порогов в диапазоне от 0.0 до 4.0 ([0.00, 0.01, ..., 3.99, 4.00]
), чтобы найти тот, который дает самые точные результаты, а затем рассматривают его как общую точность.
Вы можете увидеть это реализованным в FaceNet здесь и в OpenFace здесь.
Почему в качестве шага от 0.0 до 4.0 выбрано значение 0.01? Почему не 0.001 или 0.0001?
Более того, FaceNet использует набор данных LFW. Набор данных LFW определяет свой собственный специфический протокол для оценки, который реализован в FaceNet и OpenFace. Так неужели неправильно говорить, что способ, которым FaceNet и OpenFace оценивают свою модель, эксклюзивен только для набора данных LFW?
В таком случае, как нам следует оценивать нашу модель на других наборах данных, помимо LFW?
Вы можете использовать ROC_CURVE из SKLEARN, чтобы определить ваш порог. Вот ссылка, которая может помочь: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
Ответ или решение
Чтобы определить пороговое значение для оценки сходства между двумя эмбеддингами, полученными из модели, обученной с использованием триплетной потери (Triplet Loss), необходимо учесть несколько факторов.
1. Выбор порога
Порог для определения сходства двух эмбеддингов не обязательно должен совпадать с гиперпараметром маржи (alpha), используемым в функции потерь. Гиперпараметр маржи задает, на сколько один положительный пример должен быть ближе к якорному примеру, чем отрицательный, но не служит прямым индикатором порога для измерения сходства.
Чтобы выбрать оптимальное пороговое значение, существует несколько методов. Одним из широко используемых подходов является использование ROC-кривой (Receiver Operating Characteristic curve). Сначала вы можете вычислить расстояния между эмбеддингами (например, используя евклидово расстояние или косинусное расстояние) для всех пар изображений в вашем валидационном наборе данных, а затем:
- Разделить ваши данные на положительные и отрицательные пары.
- Построить ROC-кривую, чтобы оценить производительность модели на различных значениях порога.
- Выбрать порог на основании желаемой метрики (например, точности, полноты или F1-меры).
В Python можно использовать библиотеку sklearn для получения ROC-кривой и вычисления оптимального порога. Документацию можно найти здесь.
2. Шаги для тестирования порога
В случае FaceNet и OpenFace, которые протестировали 400 порогов от 0.0 до 4.0 с шагом 0.01, такое количество и размер шага выбраны для того, чтобы получить достаточно подробную кривую и тем самым повысить точность оценки. Шаг в 0.01 позволяет более точно поймать оптимальный порог на глаз, но значение 0.001 или 0.0001 может создать значительные вычислительные затраты без значительного улучшения точности.
3. Специфика набора данных LFW
Важно отметить, что подходы оценки, использующие определенные наборы данных, такие как LFW (Labeled Faces in the Wild), могут не подходить для других наборов данных. Протоколы оценки могут варьироваться, и они могут быть специфичными для характера данных и задач, которые вы пытаетесь решить.
4. Оценка на других наборах данных
Для оценки вашей модели на других наборах данных стоит продумать свои собственные протоколы. Вот несколько рекомендаций:
-
Создайте валидационный набор данных: Разделите свои данные на обучающую и валидационную выборки. Убедитесь, что валидационная выборка адекватно отражает сложность ваших данных.
-
Используйте кросс-валидацию: Это поможет вам лучше оценить стабильность вашего порога.
-
Адаптируйте параметры в зависимости от задачи: Возможно, вам потребуется провести испытания с разными порогами и шагами, чтобы определить наилучший для вашего конкретного случая.
Таким образом, выбор порога для определения сходства между эмбеддингами является важной и детализированной задачей, которая требует тщательной настройки и тестирования на валидационных наборах данных.