Новости! Мы выпустили реализацию SimCLR для TF2 (вместе с преобразованными контрольными точками в TF2), они находятся в папке tf2/.
Новости! Добавлены колабы по интригующим свойствам контрастных потерь, см. здесь.
Здесь мы открыли исходный код всего 65 предварительно обученных моделей, что соответствует моделям, приведенным в таблице 1 документа SimCLRv2:
Глубина | Ширина | СК | Парам (М) | ФТ (1%) | FT(10%) | FT(100%) | Линейная оценка | Контролируемый |
---|---|---|---|---|---|---|---|---|
50 | 1X | ЛОЖЬ | 24 | 57,9 | 68,4 | 76,3 | 71,7 | 76,6 |
50 | 1X | Истинный | 35 | 64,5 | 72,1 | 78,7 | 74,6 | 78,5 |
50 | 2X | ЛОЖЬ | 94 | 66,3 | 73,9 | 79,1 | 75,6 | 77,8 |
50 | 2X | Истинный | 140 | 70,6 | 77,0 | 81,3 | 77,7 | 79,3 |
101 | 1X | ЛОЖЬ | 43 | 62,1 | 71,4 | 78,2 | 73,6 | 78,0 |
101 | 1X | Истинный | 65 | 68,3 | 75,1 | 80,6 | 76,3 | 79,6 |
101 | 2X | ЛОЖЬ | 170 | 69,1 | 75,8 | 80,7 | 77,0 | 78,9 |
101 | 2X | Истинный | 257 | 73,2 | 78,8 | 82,4 | 79,0 | 80,1 |
152 | 1X | ЛОЖЬ | 58 | 64,0 | 73,0 | 79,3 | 74,5 | 78,3 |
152 | 1X | Истинный | 89 | 70,0 | 76,5 | 81,3 | 77,2 | 79,9 |
152 | 2X | ЛОЖЬ | 233 | 70,2 | 76,6 | 81,1 | 77,4 | 79,1 |
152 | 2X | Истинный | 354 | 74,2 | 79,4 | 82,9 | 79,4 | 80,4 |
152 | 3X | Истинный | 795 | 74,9 | 80,1 | 83,1 | 79,8 | 80,5 |
Эти контрольные точки хранятся в Google Cloud Storage:
Мы также предоставляем примеры использования контрольных точек в папке colabs/
.
Предварительно обученные модели (базовая сеть со слоем линейного классификатора) можно найти ниже. Обратите внимание, что для этих контрольных точек SimCLRv1 проекционная головка недоступна.
Модель КПП и хаб-модуля | ImageNet Топ-1 |
---|---|
Реснет50 (1x) | 69,1 |
Реснет50 (2x) | 74,2 |
Реснет50 (4x) | 76,6 |
Дополнительные контрольные точки SimCLRv1 доступны: gs://simclr-checkpoints/simclrv1.
Примечание о сигнатурах модуля TensorFlow Hub: default
— это выходные данные представления базовой сети; logits_sup
— это логиты контролируемой классификации для категорий ImageNet 1000. Другие (например, initial_max_pool
, block_group1
) являются средними уровнями ResNet; подробности см. на resnet.py. См. это руководство для получения дополнительной информации об использовании модулей TensorFlow Hub.
Наши модели обучены с помощью ТПУ. При использовании нашего кода для предварительного обучения рекомендуется запускать распределенное обучение с помощью TPU.
Наш код также может работать на одном графическом процессоре. Он не поддерживает несколько графических процессоров по таким причинам, как глобальный BatchNorm и контрастные потери между ядрами.
Код совместим как с TensorFlow v1, так и с v2. Все необходимые условия см. в файле require.txt. Вы также можете установить их с помощью следующей команды.
pip install -r requirements.txt
Чтобы предварительно обучить модель на CIFAR-10 с одним графическим процессором, попробуйте следующую команду:
python run.py --train_mode=pretrain
--train_batch_size=512 --train_epochs=1000
--learning_rate=1.0 --weight_decay=1e-4 --temperature=0.5
--dataset=cifar10 --image_size=32 --eval_split=test --resnet_depth=18
--use_blur=False --color_jitter_strength=0.5
--model_dir=/tmp/simclr_test --use_tpu=False
Чтобы предварительно обучить модель в ImageNet с помощью Cloud TPU, сначала ознакомьтесь с руководством по Google Cloud TPU, где вы найдете базовую информацию о том, как использовать Google Cloud TPU.
После того как вы создали виртуальную машину с Cloud TPU и предварительно загрузили данные ImageNet для tensorflow_datasets, установите следующие переменные среды:
TPU_NAME=<tpu-name>
STORAGE_BUCKET=gs://<storage-bucket>
DATA_DIR=$STORAGE_BUCKET/<path-to-tensorflow-dataset>
MODEL_DIR=$STORAGE_BUCKET/<path-to-store-checkpoints>
Следующую команду можно использовать для предварительного обучения ResNet-50 в ImageNet (что отражает гиперпараметры по умолчанию в нашей статье):
python run.py --train_mode=pretrain
--train_batch_size=4096 --train_epochs=100 --temperature=0.1
--learning_rate=0.075 --learning_rate_scaling=sqrt --weight_decay=1e-4
--dataset=imagenet2012 --image_size=224 --eval_split=validation
--data_dir=$DATA_DIR --model_dir=$MODEL_DIR
--use_tpu=True --tpu_name=$TPU_NAME --train_summary_steps=0
Для размера пакета 4096 требуется не менее 32 TPU. 100 эпох занимает около 6 часов с 32 TPU v3. Обратите внимание, что скорость обучения 0,3 с learning_rate_scaling=linear
эквивалентна скорости обучения 0,075 с learning_rate_scaling=sqrt
, когда размер пакета равен 4096. Однако использование масштабирования sqrt позволяет лучше обучаться при использовании меньшего размера пакета.
Чтобы точно настроить линейную головку (с одним графическим процессором), попробуйте следующую команду:
python run.py --mode=train_then_eval --train_mode=finetune
--fine_tune_after_block=4 --zero_init_logits_layer=True
--variable_schema='(?!global_step|(?:.*/|^)Momentum|head)'
--global_bn=False --optimizer=momentum --learning_rate=0.1 --weight_decay=0.0
--train_epochs=100 --train_batch_size=512 --warmup_epochs=0
--dataset=cifar10 --image_size=32 --eval_split=test --resnet_depth=18
--checkpoint=/tmp/simclr_test --model_dir=/tmp/simclr_test_ft --use_tpu=False
Вы можете проверить результаты с помощью тензорной доски, например
python -m tensorboard.main --logdir=/tmp/simclr_test
Для справки: приведенные выше прогоны на CIFAR-10 должны дать точность около 91%, хотя их можно дополнительно оптимизировать.
Для точной настройки линейной головки в ImageNet с использованием Cloud TPU сначала установите для CHKPT_DIR
значение предварительно обученного каталога модели и установите новый MODEL_DIR
, затем используйте следующую команду:
python run.py --mode=train_then_eval --train_mode=finetune
--fine_tune_after_block=4 --zero_init_logits_layer=True
--variable_schema='(?!global_step|(?:.*/|^)Momentum|head)'
--global_bn=False --optimizer=momentum --learning_rate=0.1 --weight_decay=1e-6
--train_epochs=90 --train_batch_size=4096 --warmup_epochs=0
--dataset=imagenet2012 --image_size=224 --eval_split=validation
--data_dir=$DATA_DIR --model_dir=$MODEL_DIR --checkpoint=$CHKPT_DIR
--use_tpu=True --tpu_name=$TPU_NAME --train_summary_steps=0
Для справки: приведенные выше прогоны в ImageNet должны дать вам точность около 64,5%.
Вы можете получить доступ к 1% и 10% подмножествам ImageNet, используемым для полуконтролируемого обучения, через наборы данных тензорного потока: просто установите dataset=imagenet2012_subset/1pct
и dataset=imagenet2012_subset/10pct
в командной строке для точной настройки этих подмножеств.
Вы также можете найти идентификаторы изображений этих подмножеств в imagenet_subsets/
.
Для точной настройки всей сети ImageNet (1% меток) используйте следующую команду:
python run.py --mode=train_then_eval --train_mode=finetune
--fine_tune_after_block=-1 --zero_init_logits_layer=True
--variable_schema='(?!global_step|(?:.*/|^)Momentum|head_supervised)'
--global_bn=True --optimizer=lars --learning_rate=0.005
--learning_rate_scaling=sqrt --weight_decay=0
--train_epochs=60 --train_batch_size=1024 --warmup_epochs=0
--dataset=imagenet2012_subset/1pct --image_size=224 --eval_split=validation
--data_dir=$DATA_DIR --model_dir=$MODEL_DIR --checkpoint=$CHKPT_DIR
--use_tpu=True --tpu_name=$TPU_NAME --train_summary_steps=0
--num_proj_layers=3 --ft_proj_selector=1
Установите checkpoint
для тех, которые только предварительно обучены, но не настроены точно. Учитывая, что контрольные точки SimCLRv1 не содержат проекцию head, рекомендуется запускать с контрольными точками SimCLRv2 (вы все равно можете запускать с контрольными точками SimCLRv1, но variable_schema
должна исключить head
). Для достижения наилучшей производительности num_proj_layers
и ft_proj_selector
необходимо соответствующим образом настроить в соответствии с документом SimCLRv2.
Этот репозиторий предоставляет решение для преобразования предварительно обученных контрольных точек Tensorflow SimCLRv1 в точки Pytorch.
Этот репозиторий предоставляет решение для преобразования предварительно обученных контрольных точек SimCLRv2 Tensorflow в точки Pytorch.
(Не стесняйтесь поделиться своей реализацией, создав задачу)
Реализации в PyTorch:
Реализации в Tensorflow 2/Keras (официальная реализация TF2 добавлена в папку tf2/):
Размер пакета : исходные результаты SimCLR были настроены под большой размер пакета (т. е. 4096), что приводит к неоптимальным результатам при обучении с использованием меньшего размера пакета. Однако при хорошем наборе гиперпараметров (в основном, скорости обучения, температуры, глубины проекционной головки) небольшие размеры партий могут дать результаты, которые находятся на одном уровне с большими размерами партий (например, см. Таблицу 2 в этой статье).
Предварительно обученные модели/контрольные точки : SimCLRv1 и SimCLRv2 предварительно обучены с разными затуханиями веса, поэтому предварительно обученные модели из двух версий имеют очень разные весовые нормы (сверточные веса в SimCLRv1 ResNet-50 в среднем в 16,8 раза больше, чем в SimCLRv2). Для точной настройки предварительно обученных моделей из обеих версий можно использовать оптимизатор LARS, но для этого требуются совсем другие гиперпараметры (например, скорость обучения, затухание веса), если вы используете оптимизатор импульса. Таким образом, в последнем случае вы можете либо выполнить поиск очень разных hparams в зависимости от используемой версии, либо повторно масштабировать вес (т. е. параметры kernel
conv base_model
в контрольных точках), чтобы убедиться, что они находятся примерно в одном масштабе. .
Документ SimCLR:
@article{chen2020simple,
title={A Simple Framework for Contrastive Learning of Visual Representations},
author={Chen, Ting and Kornblith, Simon and Norouzi, Mohammad and Hinton, Geoffrey},
journal={arXiv preprint arXiv:2002.05709},
year={2020}
}
Документ SimCLRv2:
@article{chen2020big,
title={Big Self-Supervised Models are Strong Semi-Supervised Learners},
author={Chen, Ting and Kornblith, Simon and Swersky, Kevin and Norouzi, Mohammad and Hinton, Geoffrey},
journal={arXiv preprint arXiv:2006.10029},
year={2020}
}
Это не официальный продукт Google.