ИСПОЛЬЗОВАНИЕ НОУТБУКА JUPYTER

SimCLR или Простая структура для сравнительного изучения визуальных представлений - это современная структура обучения представлениям с самоконтролем.

Бумага SimCLR представляет несколько статей:

  1. Обучение репрезентации без учителя выигрывает от более сильных дополнений.
  2. Введение обучаемого MLP после базового кодера улучшает качество изученных представлений.
  3. Обучение представлению с контрастной кросс-энтропийной потерей выигрывает от нормализованных вложений и правильно настроенного температурного параметра.
  4. Контрастное обучение выигрывает от более крупных пакетов и более продолжительного обучения по сравнению с его аналогом с учителем. Подобно обучению с учителем, контрастное обучение выигрывает от более глубоких и широких сетей.

Каркас состоит из четырех частей:

  1. Модуль стохастического увеличения данных, который преобразует любой заданный пример данных случайным образом, что приводит к двум коррелированным представлениям одного и того же примера. Эта пара считается положительной парой. Авторы применяют три простых дополнения: Случайная обрезка с последующим Изменить размер до исходного размера, Случайные искажения цвета и Случайное размытие по Гауссу.
  2. базовый кодировщик f (.), который извлекает векторы представления из примеров расширенных данных.
  3. маленькая головка проекции нейронной сети (.), которая отображает представления в пространстве, где применяются контрастные потери.
  4. Contrastive Loss , определенная для задачи контрастного прогнозирования.

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

Некоторые моменты, на которые следует обратить внимание:

  • В исходной статье авторы использовали несколько графических процессоров и большие объемы пакетов для достижения высочайшей производительности. Также авторы использовали набор данных ImageNet, состоящий из более чем 1 миллиона изображений.
  • Однако из-за недоступности такого высокотехнологичного оборудования у автора этой статьи представленная здесь реализация будет работать только на одном графическом процессоре и с размером пакета всего 128. Кроме того, мы будем использовать набор данных CIFAR10. Авторы оригинальной статьи также запускали SimCLR на CIFAR10, так что можно будет сравнить производительность нашей реализации с их собственной.
  • Мы собираемся использовать оптимизатор LARS со скоростью обучения 0,2. График скорости обучения также будет таким же, как указано в документе, то есть линейная разминка для 10 эпох, а затем график косинусного затухания. Читатели могут позволить себе изменить оптимизатор в соответствии со своими требованиями.
  • Код выполнялся в течение 100 эпох на Tesla V100 GPU в Google Colab Pro. Время, затрачиваемое на каждую эпоху предтренинга, составляет примерно 3,5 минуты. На Tesla P100 GPU это занимает примерно 4,5 минуты для каждой эпохи.
  • Применяемые дополнения: случайное горизонтальное отражение, случайное кадрирование и изменение размера и искажение цвета.

Импортировать библиотеки

Установите Seed для воспроизводимости

Скачать набор данных CIFAR10

Создание DataLoader

Чтение набора данных

Пусть разделение обучения и проверки будет 80:20. Без особых сложностей, давайте рассмотрим «batch-5» набора данных CIFAR10 в качестве набора для проверки, а остальные - как набор для обучения. Мы также вычисляем среднее по каналам и стандартное отклонение значений пикселей в обучающей выборке.

trimages = images[:40000]
valimages = images[40000:]
trlabels = labels[:40000]
vallabels = labels[40000:]
MEAN = np.mean(trimages/255.0,axis=(0,2,3),keepdims=True)
STD = np.std(trimages/255.0,axis=(0,2,3),keepdims=True)
print(MEAN)
>>> [[[[0.49145363]]    [[0.48206213]]    [[0.44622512]]]]
print(STD)
>>> [[[[0.24716829]]    [[0.24370658]]    [[0.26169213]]]]

DataGenerator

DataLoader

В приведенных выше фрагментах кода вы меняете все в соответствии с вашими потребностями. Ниже показан образец одного пакета входных данных.

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

Модель

  • Модуль Identity выдает то, что принимает на входе.
  • Модуль LinearLayer дает один линейный слой, за которым следует дополнительный слой BatchNormalization.
  • Модуль ProjectionHead дает линейную или нелинейную проекцию головы в зависимости от переданного аргумента.
  • Модуль PreModel дает модель, которая будет использоваться для предварительного обучения, то есть базовый кодировщик f (.) с MLP g (.) поверх него. Класс PreModel использует ResNet50. Однако его можно изменить в соответствии с вашими потребностями и даже сделать настраиваемым с помощью небольшой дополнительной работы.

Функция потерь

Код функции Loss был взят из этого репо (Spijkervet / SimCLR) и немного изменен. Люди, работающие с несколькими графическими процессорами, могут обратиться к репозиторию за дополнительной помощью.

Оптимизатор

Реализация оптимизатора LARS также взята из Spijkervet / SimCLR. Однако некоторые проблемы, возникшие в репо, были исправлены в приведенном ниже коде. Эта реализация также похожа на реализацию Tensorflow в google-research / simclr.

Объявление функций оптимизатора, планировщика и потерь

Некоторые дополнительные функции

Обучение

Результат предварительной тренировки

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

Создать модель Downstream

Во фрагменте кода ниже показано, что параметры предварительно обученной модели заморожены. Так обстоит дело с линейной оценкой. Однако, если кто-то хочет доработать всю модель, измените p.requires_grad = False на p.requires_grad = True.

Кроме того, здесь можно увидеть, что проектор не используется в последующей задаче.

DataGenerator для задачи Downstream

В последующей задаче не использовалось никаких дополнений, кроме RandomResizedCrop. Кроме того, вы можете просто использовать DataLoader, как показано в учебнике PyTorch CIFAR10. "Ссылка"

Еще несколько деклараций

Последующее обучение

Результаты последующего обучения

Вывод в нисходящем направлении

Предварительно обученная модель достигла примерно 85% при линейной оценке в последующей задаче классификации. Авторы оригинальной статьи о SimCLR достигли около 84% результатов линейной оценки на CIFAR10.

Записную книжку Jupyter можно найти здесь.

Пожалуйста, похлопайте по статье, если она вам нравится!