ИСПОЛЬЗОВАНИЕ НОУТБУКА JUPYTER
SimCLR или Простая структура для сравнительного изучения визуальных представлений - это современная структура обучения представлениям с самоконтролем.
Бумага SimCLR представляет несколько статей:
- Обучение репрезентации без учителя выигрывает от более сильных дополнений.
- Введение обучаемого MLP после базового кодера улучшает качество изученных представлений.
- Обучение представлению с контрастной кросс-энтропийной потерей выигрывает от нормализованных вложений и правильно настроенного температурного параметра.
- Контрастное обучение выигрывает от более крупных пакетов и более продолжительного обучения по сравнению с его аналогом с учителем. Подобно обучению с учителем, контрастное обучение выигрывает от более глубоких и широких сетей.
Каркас состоит из четырех частей:
- Модуль стохастического увеличения данных, который преобразует любой заданный пример данных случайным образом, что приводит к двум коррелированным представлениям одного и того же примера. Эта пара считается положительной парой. Авторы применяют три простых дополнения: Случайная обрезка с последующим Изменить размер до исходного размера, Случайные искажения цвета и Случайное размытие по Гауссу.
- базовый кодировщик f (.), который извлекает векторы представления из примеров расширенных данных.
- маленькая головка проекции нейронной сети (.), которая отображает представления в пространстве, где применяются контрастные потери.
- 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 можно найти здесь.
Пожалуйста, похлопайте по статье, если она вам нравится!