소식! 우리는 SimCLR의 TF2 구현을 출시했으며(TF2의 변환된 체크포인트와 함께) tf2/ 폴더에 있습니다.
소식! 대비 손실의 흥미로운 속성에 대한 Colab이 추가되었습니다. 여기를 참조하세요.
우리는 SimCLRv2 논문의 표 1에 있는 모델에 해당하는 총 65개의 사전 훈련된 모델을 여기에서 오픈소스화했습니다.
깊이 | 너비 | SK | 파람(M) | FT (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위 |
---|---|
ResNet50(1x) | 69.1 |
ResNet50(2x) | 74.2 |
ResNet50(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로 학습되었습니다. 사전 학습을 위해 코드를 사용할 때 TPU로 분산 학습을 실행하는 것이 좋습니다.
우리의 코드는 단일 GPU에서도 실행될 수 있습니다. 전역 BatchNorm 및 코어 간 대비 손실과 같은 이유로 다중 GPU를 지원하지 않습니다.
이 코드는 TensorFlow v1 및 v2와 모두 호환됩니다. 모든 필수 구성 요소는 요구사항.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이면 TPU가 32개 이상 필요합니다. TPU v3 32개를 사용하면 100세대는 약 6시간이 걸립니다. learning_rate_scaling=linear
의 학습률 0.3은 배치 크기가 4096일 때 learning_rate_scaling=sqrt
의 학습률 0.075와 동일합니다. 그러나 sqrt 스케일링을 사용하면 더 작은 배치 크기를 사용할 때 더 잘 훈련할 수 있습니다.
선형 헤드(단일 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
다음과 같은 텐서보드를 사용하여 결과를 확인할 수 있습니다.
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 체크포인트에는 프로젝션 헤드가 포함되어 있지 않으므로 SimCLRv2 체크포인트로 실행하는 것이 좋습니다(계속 SimCLRv1 체크포인트로 실행할 수 있지만 variable_schema
head
제외해야 함). 최상의 성능을 얻으려면 SimCLRv2 문서에 따라 num_proj_layers
및 ft_proj_selector
조정해야 합니다.
이 저장소는 사전 훈련된 SimCLRv1 Tensorflow 체크포인트를 Pytorch 체크포인트로 변환하기 위한 솔루션을 제공합니다.
이 저장소는 사전 훈련된 SimCLRv2 Tensorflow 체크포인트를 Pytorch 체크포인트로 변환하기 위한 솔루션을 제공합니다.
(문제를 생성하여 구현 내용을 자유롭게 공유하세요)
PyTorch의 구현:
Tensorflow 2/Keras의 구현(공식 TF2 구현이 tf2/ 폴더에 추가됨):
배치 크기 : SimCLR의 원래 결과는 큰 배치 크기(예: 4096)에서 조정되었으므로 더 작은 배치 크기를 사용하여 교육할 때 최적이 아닌 결과가 발생합니다. 그러나 적절한 하이퍼 매개변수 세트(주로 학습 속도, 온도, 프로젝션 헤드 깊이)를 사용하면 작은 배치 크기가 큰 배치 크기와 동등한 결과를 얻을 수 있습니다(예: 이 백서의 표 2 참조).
사전 학습된 모델/체크포인트 : SimCLRv1 및 SimCLRv2는 서로 다른 가중치 감소로 사전 학습되어 있으므로 두 버전의 사전 학습된 모델은 매우 다른 가중치 표준 척도를 갖습니다(SimCLRv1 ResNet-50의 컨벌루션 가중치는 SimCLRv2의 평균 16.8X입니다). 두 버전 모두에서 사전 훈련된 모델을 미세 조정하려면 LARS 최적화 프로그램을 사용하면 괜찮지만 운동량 최적화 프로그램을 사용하면 매우 다른 하이퍼파라미터(예: 학습률, 가중치 감소)가 필요합니다. 따라서 후자의 경우 사용된 버전에 따라 매우 다른 hparams를 검색하거나 가중치(예: 체크포인트에서 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 제품이 아닙니다.