Сиамские нейронные сети — это класс архитектуры нейронных сетей, предназначенный для сравнения и измерения сходства между парами входных выборок. Термин «сиамский» происходит от идеи, что сетевая архитектура состоит из двойных нейронных сетей, которые идентичны по структуре и имеют одинаковый набор весов. Каждая сеть обрабатывает один входной образец из пары, и их выходные данные сравниваются, чтобы определить сходство или различие между двумя входными данными.

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

Архитектура сиамской сети обычно состоит из трех основных компонентов: общей сети, метрики сходства и функции контрастных потерь.

  1. Общая сеть. Общая сеть является основным компонентом сиамской архитектуры. Он отвечает за извлечение значимых представлений функций из входных выборок. Общая сеть состоит из слоев нейронных блоков, таких как сверточные слои или полносвязные слои, которые обрабатывают входные данные и создают векторы встраивания фиксированной длины. Разделяя одинаковые веса между сетями-близнецами, модель учится извлекать аналогичные функции для аналогичных входных данных, что позволяет проводить эффективное сравнение.
  2. Показатель сходства. После обработки входных данных общей сетью используется показатель сходства для сравнения сгенерированных вложений и измерения сходства или различия между двумя входными данными. Выбор метрики подобия зависит от конкретной задачи и характера входных данных. Общие показатели сходства включают евклидово расстояние, косинусное сходство или коэффициент корреляции. Метрика сходства количественно определяет расстояние или корреляцию между вложениями и обеспечивает меру сходства между входными выборками.
  3. Функция контрастных потерь. Для обучения сиамской сети используется функция контрастных потерь. Функция контрастных потерь побуждает сеть производить аналогичные вложения для аналогичных входных данных и разные вложения для разнородных входных данных. Он наказывает модель, когда расстояние или непохожесть между похожими парами превышает определенный порог или когда расстояние между непохожими парами падает ниже другого порога. Точная формулировка контрастной функции потерь зависит от выбранной метрики сходства и желаемой разницы между похожими и непохожими парами.

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

Функция контрастных потерь

Контрастная потеря - это функция потерь, обычно используемая в сиамских сетях для изучения сходства или различия между парами входных выборок. Он направлен на оптимизацию параметров сети таким образом, чтобы аналогичные входные данные имели вложения, расположенные ближе друг к другу в пространстве признаков, а разнородные входные данные отодвигались дальше друг от друга. Минимизируя контрастные потери, сеть учится генерировать вложения, которые эффективно фиксируют структуру сходства входных данных.

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

  1. Входные пары: функция контрастных потерь работает с парами входных выборок, где каждая пара состоит из похожего или положительного примера и непохожего или отрицательного примера. Эти пары обычно генерируются в процессе обучения, при этом положительные пары представляют похожие экземпляры, а отрицательные пары представляют разные экземпляры.
  2. Встраивание. Сиамская сеть обрабатывает каждую входную выборку через общую сеть, создавая векторы встраивания для обеих выборок в паре. Эти вложения представляют собой представления фиксированной длины, которые фиксируют основные характеристики входных выборок.
  3. Метрика расстояния. Метрика расстояния, такая как евклидово расстояние или косинусное сходство, используется для измерения различия или сходства между сгенерированными вложениями. Выбор метрики расстояния зависит от характера входных данных и конкретных требований задачи.
  4. Вычисление контрастных потерь. Функция контрастных потерь вычисляет потери для каждой пары вложений, поощряя аналогичные пары иметь меньшее расстояние, а разнородные пары - большее расстояние. Общая формула контрастных потерь выглядит следующим образом:
  5. L = (1 — y) * D² + y * max(0, m — D)²

Где:

  • L: Контрастный убыток для пары.
  • D: Расстояние или несходство между вложениями.
  • y: метка, указывающая, похожа ли пара (0 — похожая, 1 — непохожая).
  • m: Параметр Margin, определяющий порог непохожести.

Член потери (1 — y) * D² наказывает аналогичные пары, если их расстояние превышает запас (м), поощряя сеть сокращать их расстояние. Термин y * max(0, m — D)² наказывает разнородные пары, если их расстояние падает ниже границы, подталкивая сеть к увеличению их расстояния.

5. Агрегирование потерь. Чтобы получить общие контрастные потери для всей партии входных пар, отдельные потери обычно усредняются или суммируются по всем парам. Выбор метода агрегирования зависит от конкретной цели обучения и стратегии оптимизации.

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

Функция контрастных потерь играет решающую роль в обучении сиамских сетей, позволяя им изучать значимые представления, которые можно использовать для различных задач, таких как сходство изображений, проверка лица и сходство текста. Конкретная формулировка и параметры функции контрастных потерь могут быть скорректированы в зависимости от характеристик данных и требований решаемой задачи.

Сиамские нейронные сети в PyTorch

Тогда приступим к написанию кода!

1. Создание набора данных

Мы используем набор изображений собак из репозитория http://vision.stanford.edu/aditya86/ImageNetDogs/.

Как только изображения собак загружаются из репо по ссылке. Папка выглядит так

# структура каталогов изображений собак после загрузки из репозитория:

# корневой_каталог

# ├── Японский_спаниель

# │ ├── Japanese_spaniel.jpg

# │ ├── Японский_спаниель2.jpg

# │ └── …

# └── Ши-тцу

# ├── Ши-Тцу1.jpg

# ├── Ши-Тцу2.jpg

# └── …

Мы выбираем 3 пары похожих изображений (породы собак) и 3 пары непохожих изображений (породы собак) для точной настройки модели, чтобы упростить работу с отрицательными образцами, для заданного якорного изображения (породы собак) любой другой породы собак. чем наземная правда, порода собак считалась негативной меткой.

Отказ от ответственности — «похожие изображения» означают, что изображения собак одной породы считались положительной парой, а «разные изображения» означали, что изображения собак другой породы считались отрицательными.

Пояснение кода

В приведенной выше строке кода изображения 46:6 не были выбраны случайным образом из каждой папки с изображениями собак.

В приведенной выше строке кода № 47: выбранные изображения были перемещены в папку «tmp» и переименованы в «similar_images», поскольку они относятся к папке одной и той же породы собак.

В приведенной выше строке кода нет 55: как только все это будет завершено, они будут перемещены в папку «similar_all_images».

В приведенной выше строке кода нет 56,57: Аналогично, чтобы получить разнородную пару изображений, 3 изображения были выбраны из двух папок с разными породами собак.

затем описанный выше процесс был повторен снова, чтобы получить пары непохожих изображений и переместить их в папку «dissimilar_all_images».

Как только все это будет сделано, мы можем перейти к созданию объекта набора данных.

В приведенной выше строке кода от 8 до 10: изображение подвергается предварительной обработке, что включает изменение размера изображения до 256. Мы используем размер пакета 32, он может отличаться в зависимости от вашей вычислительной мощности и графического процессора.

Наша сеть называется SiameseNetwork, и мы видим, что она выглядит почти так же, как стандартная CNN. Единственное отличие, которое можно заметить, это то, что у нас есть две форвардные функции (forward_onceи forward). Почему это?

Мы упоминали, что мы передаем два изображения через одну и ту же сеть. Эта forward_onceфункция, вызываемая внутри forwardфункции, будет принимать изображение в качестве входных данных и передавать его в сеть. Вывод сохраняется в output1, а вывод второго изображения сохраняется в output2, как мы видим в функции forward. Таким образом, нам удалось ввести два изображения и получить два вывода из нашей модели.

Мы увидели, как должна выглядеть функция потерь, теперь давайте ее закодируем. Мы создаем класс с именем ContrastiveLossи аналогично классу модели у нас будет функция forward.

Следуя блок-схеме сверху, мы можем начать создавать цикл обучения. Мы повторяем 100 раз и извлекаем два изображения, а также метку. Мы обнуляем градиенты и передаем два наших изображения в сеть, и сеть выдает два вектора. Затем два вектора и метка вводятся в критерий (функцию потерь), который мы определили. Делаем обратное распространение и оптимизируем. Для некоторых целей визуализации и для того, чтобы увидеть, как наша модель работает на тренировочном наборе, мы будем печатать потери каждые 10 партий.

Теперь мы можем проанализировать результаты. Первое, что мы видим, это то, что убыток начался около 1,6 и закончился числом, довольно близким к 1.

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

В качестве следующих шагов мы извлекаем первое изображение из первого пакета и повторяем 5 раз, чтобы извлечь 5 изображений из следующих 5 пакетов, потому что мы установили, что каждый пакет содержит одно изображение. Затем, объединив два изображения по горизонтали, используя torch.cat(), мы получим довольно четкую визуализацию того, какое изображение с каким сравнивается.

Мы передаем два изображения в модель и получаем два вектора, которые затем передаются в функциюF.pairwise_distance(), которая рассчитает евклидово расстояние между двумя векторами. Используя это расстояние, мы можем использовать его как показатель того, насколько непохожи два лица.

Краткое содержание

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