訊息!我們發布了 SimCLR 的 TF2 實作(以及 TF2 中轉換的檢查點),它們位於 tf2/ 資料夾中。
訊息!添加了用於對比損失的有趣特性的 Colabs,請參閱此處。
我們在這裡開源了總共 65 個預訓練模型,對應 SimCLRv2 論文表 1 中的模型:
深度 | 寬度 | SK | 參數 (M) | 金融時報 (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 Top-1 |
---|---|
ResNet50 (1x) | 69.1 |
ResNet50 (2x) | 74.2 |
ResNet50 (4x) | 76.6 |
也提供其他 SimCLRv1 檢查點:gs://simclr-checkpoints/simclrv1。
關於 TensorFlow Hub 模組簽章的說明: default
是基礎網路的表示輸出; logits_sup
是 ImageNet 1000 類別的監督分類 logits。其他(例如initial_max_pool
、 block_group1
)是ResNet的中間層;具體參考resnet.py。有關使用 TensorFlow Hub 模組的更多信息,請參閱本教程。
我們的模型是用 TPU 來訓練的。建議在使用我們的程式碼進行預訓練時使用 TPU 運行分散式訓練。
我們的程式碼也可以在單一GPU 上運行。由於全域 BatchNorm 和跨核心對比損失等原因,它不支援多 GPU。
該代碼與 TensorFlow v1 和 v2 相容。請參閱requirements.txt 以了解所有先決條件,您也可以使用以下命令安裝它們。
pip install -r requirements.txt
若要使用單一GPU 在 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
要使用 Cloud TPU 在 ImageNet 上預先訓練模型,請先查看 Google Cloud TPU 教程,以了解有關如何使用 Google Cloud TPU 的基本資訊。
使用 Cloud TPU 建立虛擬機器並預先下載 tensorflow_datasets 的 ImageNet 資料後,請設定下列環境變數:
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>
以下命令可用於在 ImageNet 上預先訓練 ResNet-50(這反映了我們論文中的預設超參數):
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。使用 32 個 TPU v3 進行 100 個 epoch 大約需要 6 小時。請注意,當批次大小為 4096 時, learning_rate_scaling=linear
的學習率為 0.3,相當於learning_rate_scaling=sqrt
的學習率為 0.075。
若要微調線性頭(使用單一 GPU),請嘗試以下命令:
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
您可以使用tensorboard檢查結果,例如
python -m tensorboard.main --logdir=/tmp/simclr_test
作為參考,上述在 CIFAR-10 上的運行應該為您提供大約 91% 的準確度,儘管它可以進一步優化。
若要使用 Cloud TPU 在 ImageNet 上微調線性頭,首先將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/
中找到這些子集的圖像 ID。
要在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 論文進行相應調整以獲得最佳性能。
此儲存庫提供了將預先訓練的 SimCLRv1 Tensorflow 檢查點轉換為 Pytorch 檢查點的解決方案。
此儲存庫提供了將預先訓練的 SimCLRv2 Tensorflow 檢查點轉換為 Pytorch 檢查點的解決方案。
(歡迎透過創建問題來分享您的實現)
PyTorch 中的實作:
Tensorflow 2 / Keras 中的實作(官方 TF2 實作已加入 tf2/ 資料夾):
批量大小:SimCLR 的原始結果是在大批量大小(即 4096)下調整的,這會導致使用較小批量大小進行訓練時得到次優結果。然而,透過一組好的超參數(主要是學習率、溫度、投影頭深度),小批量可以產生與大批量相同的結果(例如,請參閱本文中的表2)。
預訓練模型/檢查點:SimCLRv1 和SimCLRv2 使用不同的權重衰減進行預訓練,因此兩個版本的預訓練模型具有非常不同的權重範數尺度(SimCLRv1 ResNet-50 中的捲積權重平均是SimCLRv2 中的16.8 倍)。為了微調兩個版本的預訓練模型,如果您使用 LARS 優化器就可以了,但如果您使用動量優化器,則需要非常不同的超參數(例如學習率、權重衰減)。因此,對於後一種情況,您可能需要根據所使用的版本搜尋非常不同的 hparam,或重新縮放權重(即檢查點中的base_model
的捲積kernel
參數)以確保它們大致處於相同的比例。
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 官方產品。