Nachricht! Wir haben eine TF2-Implementierung von SimCLR veröffentlicht (zusammen mit konvertierten Prüfpunkten in TF2), sie befinden sich im Ordner tf2/.
Nachricht! Colabs für faszinierende Eigenschaften von Kontrastverlusten wurden hinzugefügt, siehe hier.
Wir haben hier insgesamt 65 vorab trainierte Modelle als OpenSource bereitgestellt, die denen in Tabelle 1 des SimCLRv2-Artikels entsprechen:
Tiefe | Breite | SK | Param (M) | FT (1%) | FT(10%) | FT(100%) | Lineare Auswertung | Beaufsichtigt |
---|---|---|---|---|---|---|---|---|
50 | 1X | FALSCH | 24 | 57.9 | 68,4 | 76,3 | 71,7 | 76,6 |
50 | 1X | WAHR | 35 | 64,5 | 72.1 | 78,7 | 74,6 | 78,5 |
50 | 2X | FALSCH | 94 | 66,3 | 73,9 | 79.1 | 75,6 | 77,8 |
50 | 2X | WAHR | 140 | 70.6 | 77,0 | 81,3 | 77,7 | 79,3 |
101 | 1X | FALSCH | 43 | 62.1 | 71.4 | 78,2 | 73,6 | 78,0 |
101 | 1X | WAHR | 65 | 68,3 | 75.1 | 80,6 | 76,3 | 79,6 |
101 | 2X | FALSCH | 170 | 69.1 | 75,8 | 80,7 | 77,0 | 78,9 |
101 | 2X | WAHR | 257 | 73,2 | 78,8 | 82,4 | 79,0 | 80.1 |
152 | 1X | FALSCH | 58 | 64,0 | 73,0 | 79,3 | 74,5 | 78,3 |
152 | 1X | WAHR | 89 | 70,0 | 76,5 | 81,3 | 77,2 | 79,9 |
152 | 2X | FALSCH | 233 | 70.2 | 76,6 | 81.1 | 77,4 | 79.1 |
152 | 2X | WAHR | 354 | 74.2 | 79,4 | 82,9 | 79,4 | 80,4 |
152 | 3X | WAHR | 795 | 74,9 | 80.1 | 83.1 | 79,8 | 80,5 |
Diese Prüfpunkte werden im Google Cloud Storage gespeichert:
Wir stellen auch Beispiele zur Verwendung der Prüfpunkte im Ordner colabs/
bereit.
Die vorab trainierten Modelle (Basisnetzwerk mit linearer Klassifikatorschicht) finden Sie unten. Beachten Sie, dass für diese SimCLRv1-Kontrollpunkte der Projektionskopf nicht verfügbar ist.
Modell-Checkpoint und Hub-Modul | ImageNet Top-1 |
---|---|
ResNet50 (1x) | 69.1 |
ResNet50 (2x) | 74.2 |
ResNet50 (4x) | 76,6 |
Zusätzliche SimCLRv1-Prüfpunkte sind verfügbar: gs://simclr-checkpoints/simclrv1.
Ein Hinweis zu den Signaturen des TensorFlow Hub-Moduls: default
ist die Darstellungsausgabe des Basisnetzwerks; logits_sup
ist das überwachte Klassifizierungsprotokoll für ImageNet 1000-Kategorien. Andere (z. B. initial_max_pool
, block_group1
) sind mittlere Schichten von ResNet; Einzelheiten finden Sie unter resnet.py. Weitere Informationen zur Verwendung von TensorFlow Hub-Modulen finden Sie in diesem Tutorial.
Unsere Modelle werden mit TPUs trainiert. Es wird empfohlen, verteiltes Training mit TPUs durchzuführen, wenn Sie unseren Code für das Vortraining verwenden.
Unser Code kann auch auf einer einzelnen GPU ausgeführt werden. Aus Gründen wie der globalen BatchNorm und dem Kontrastverlust zwischen den Kernen werden keine Multi-GPUs unterstützt.
Der Code ist sowohl mit TensorFlow v1 als auch v2 kompatibel. Alle Voraussetzungen finden Sie in der Datei „requirements.txt“. Sie können sie auch mit dem folgenden Befehl installieren.
pip install -r requirements.txt
Um das Modell auf CIFAR-10 mit einer einzelnen GPU vorab zu trainieren, versuchen Sie den folgenden Befehl:
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
Um das Modell auf ImageNet mit Cloud TPUs vorab zu trainieren, sehen Sie sich zunächst das Google Cloud TPU-Tutorial an, um grundlegende Informationen zur Verwendung von Google Cloud TPUs zu erhalten.
Nachdem Sie eine virtuelle Maschine mit Cloud TPUs erstellt und die ImageNet-Daten für tensorflow_datasets vorab heruntergeladen haben, legen Sie bitte die folgenden Umgebungsvariablen fest:
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>
Der folgende Befehl kann verwendet werden, um ein ResNet-50 auf ImageNet vorab zu trainieren (was die Standard-Hyperparameter in unserem Artikel widerspiegelt):
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
Eine Chargengröße von 4096 erfordert mindestens 32 TPUs. 100 Epochen dauern mit 32 TPU v3 etwa 6 Stunden. Beachten Sie, dass eine Lernrate von 0,3 mit learning_rate_scaling=linear
der von 0,075 mit learning_rate_scaling=sqrt
entspricht, wenn die Batch-Größe 4096 beträgt. Die Verwendung der sqrt-Skalierung ermöglicht jedoch ein besseres Training, wenn eine kleinere Batch-Größe verwendet wird.
Um einen linearen Kopf (mit einer einzelnen GPU) zu optimieren, versuchen Sie den folgenden Befehl:
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
Sie können die Ergebnisse mithilfe eines Tensorboards überprüfen, z
python -m tensorboard.main --logdir=/tmp/simclr_test
Als Referenz: Die oben genannten Läufe auf CIFAR-10 sollten eine Genauigkeit von etwa 91 % liefern, obwohl sie noch weiter optimiert werden kann.
Für die Feinabstimmung eines linearen Kopfs auf ImageNet mithilfe von Cloud TPUs setzen Sie zunächst CHKPT_DIR
auf das vorab trainierte Modellverzeichnis und legen Sie ein neues MODEL_DIR
fest. Verwenden Sie dann den folgenden Befehl:
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
Als Referenz: Die oben genannten Läufe auf ImageNet sollten eine Genauigkeit von etwa 64,5 % ergeben.
Sie können über Tensorflow-Datensätze auf 1 % und 10 % ImageNet-Teilmengen zugreifen, die für halbüberwachtes Lernen verwendet werden: Legen Sie einfach dataset=imagenet2012_subset/1pct
und dataset=imagenet2012_subset/10pct
in der Befehlszeile fest, um diese Teilmengen zu optimieren.
Sie finden die Bild-IDs dieser Teilmengen auch in imagenet_subsets/
.
Um das gesamte Netzwerk auf ImageNet (1 % der Etiketten) zu optimieren, verwenden Sie den folgenden Befehl:
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
Legen Sie den checkpoint
auf diejenigen fest, die nur vorab trainiert, aber nicht fein abgestimmt sind. Da SimCLRv1-Prüfpunkte keinen Projektionskopf enthalten, wird die Ausführung mit SimCLRv2-Prüfpunkten empfohlen (Sie können weiterhin mit SimCLRv1-Prüfpunkten ausgeführt werden, variable_schema
muss jedoch head
ausschließen). Die num_proj_layers
und ft_proj_selector
müssen gemäß dem SimCLRv2-Dokument entsprechend angepasst werden, um die beste Leistung zu erzielen.
Dieses Repo bietet eine Lösung zum Konvertieren der vorab trainierten SimCLRv1-Tensorflow-Prüfpunkte in Pytorch-Prüfpunkte.
Dieses Repo bietet eine Lösung zum Konvertieren der vorab trainierten SimCLRv2-Tensorflow-Prüfpunkte in Pytorch-Prüfpunkte.
(Sie können Ihre Implementierung gerne teilen, indem Sie ein Problem erstellen.)
Implementierungen in PyTorch:
Implementierungen in Tensorflow 2/Keras (offizielle TF2-Implementierung wurde im Ordner tf2/ hinzugefügt):
Batch-Größe : Die ursprünglichen Ergebnisse von SimCLR wurden auf eine große Batch-Größe (z. B. 4096) abgestimmt, was beim Training mit einer kleineren Batch-Größe zu suboptimalen Ergebnissen führt. Mit einem guten Satz an Hyperparametern (hauptsächlich Lernrate, Temperatur, Tiefe des Projektionskopfs) können kleine Chargengrößen jedoch Ergebnisse liefern, die denen großer Chargengrößen ebenbürtig sind (siehe z. B. Tabelle 2 in diesem Dokument).
Vorab trainierte Modelle/Checkpoints : SimCLRv1 und SimCLRv2 werden mit unterschiedlichen Gewichtsabfällen vorab trainiert, daher haben die vorab trainierten Modelle aus den beiden Versionen sehr unterschiedliche Gewichtsnormskalen (Faltungsgewichte in SimCLRv1 ResNet-50 betragen im Durchschnitt das 16,8-fache von denen in SimCLRv2). Für die Feinabstimmung der vorab trainierten Modelle aus beiden Versionen ist es in Ordnung, einen LARS-Optimierer zu verwenden, aber es erfordert sehr unterschiedliche Hyperparameter (z. B. Lernrate, Gewichtsabfall), wenn Sie den Impulsoptimierer verwenden. Im letzteren Fall möchten Sie möglicherweise entweder nach sehr unterschiedlichen Hparams suchen, je nachdem, welche Version verwendet wird, oder die Gewichtung (dh die Conv- kernel
-Parameter von base_model
in den Prüfpunkten) neu skalieren, um sicherzustellen, dass sie ungefähr im gleichen Maßstab liegen .
SimCLR-Artikel:
@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-Papier:
@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}
}
Dies ist kein offizielles Google-Produkt.