Berita! Kami telah merilis implementasi TF2 dari SimCLR (bersama dengan pos pemeriksaan yang dikonversi di TF2), semuanya ada di folder tf2/.
Berita! Colab untuk Properti Menarik dari Kerugian Kontrasif telah ditambahkan, lihat di sini.
Kami melakukan opensource total 65 model terlatih di sini, sesuai dengan yang ada di Tabel 1 makalah SimCLRv2:
Kedalaman | Lebar | SK | Param (L) | SEPERTI (1%) | SEPERTI (10%) | SEPERTI (100%) | Evaluasi linier | Diawasi |
---|---|---|---|---|---|---|---|---|
50 | 1X | PALSU | 24 | 57.9 | 68.4 | 76.3 | 71.7 | 76.6 |
50 | 1X | BENAR | 35 | 64.5 | 72.1 | 78.7 | 74.6 | 78.5 |
50 | 2X | PALSU | 94 | 66.3 | 73.9 | 79.1 | 75.6 | 77.8 |
50 | 2X | BENAR | 140 | 70.6 | 77.0 | 81.3 | 77.7 | 79.3 |
101 | 1X | PALSU | 43 | 62.1 | 71.4 | 78.2 | 73.6 | 78.0 |
101 | 1X | BENAR | 65 | 68.3 | 75.1 | 80.6 | 76.3 | 79.6 |
101 | 2X | PALSU | 170 | 69.1 | 75.8 | 80.7 | 77.0 | 78.9 |
101 | 2X | BENAR | 257 | 73.2 | 78.8 | 82.4 | 79.0 | 80.1 |
152 | 1X | PALSU | 58 | 64.0 | 73.0 | 79.3 | 74.5 | 78.3 |
152 | 1X | BENAR | 89 | 70.0 | 76.5 | 81.3 | 77.2 | 79.9 |
152 | 2X | PALSU | 233 | 70.2 | 76.6 | 81.1 | 77.4 | 79.1 |
152 | 2X | BENAR | 354 | 74.2 | 79.4 | 82.9 | 79.4 | 80.4 |
152 | 3X | BENAR | 795 | 74.9 | 80.1 | 83.1 | 79.8 | 80,5 |
Pos pemeriksaan ini disimpan di Google Cloud Storage:
Kami juga memberikan contoh cara menggunakan checkpoint di folder colabs/
.
Model terlatih (jaringan dasar dengan lapisan pengklasifikasi linier) dapat ditemukan di bawah. Perhatikan bahwa untuk pos pemeriksaan SimCLRv1 ini, kepala proyeksi tidak tersedia.
Pos pemeriksaan model dan modul hub | ImageNet Teratas-1 |
---|---|
ResNet50 (1x) | 69.1 |
ResNet50 (2x) | 74.2 |
ResNet50 (4x) | 76.6 |
Pos pemeriksaan SimCLRv1 tambahan tersedia: gs://simclr-checkpoints/simclrv1.
Catatan tentang tanda tangan modul TensorFlow Hub: default
adalah output representasi dari jaringan dasar; logits_sup
adalah logit klasifikasi yang diawasi untuk kategori ImageNet 1000. Lainnya (misal: initial_max_pool
, block_group1
) adalah lapisan tengah ResNet; lihat resnet.py untuk detailnya. Lihat tutorial ini untuk informasi tambahan mengenai penggunaan modul TensorFlow Hub.
Model kami dilatih dengan TPU. Disarankan untuk menjalankan pelatihan terdistribusi dengan TPU saat menggunakan kode kami untuk pra-pelatihan.
Kode kami juga dapat dijalankan pada satu GPU. Ini tidak mendukung multi-GPU, karena alasan seperti BatchNorm global dan kehilangan kontras antar inti.
Kode ini kompatibel dengan TensorFlow v1 dan v2. Lihat persyaratan.txt untuk semua prasyarat, dan Anda juga dapat menginstalnya menggunakan perintah berikut.
pip install -r requirements.txt
Untuk melakukan pra-pelatihan model pada CIFAR-10 dengan satu GPU, coba perintah berikut:
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
Untuk melakukan pra-pelatihan model di ImageNet dengan Cloud TPU, pertama-tama lihat tutorial Google Cloud TPU untuk mengetahui informasi dasar tentang cara menggunakan Google Cloud TPU.
Setelah Anda membuat mesin virtual dengan Cloud TPU, dan mengunduh data ImageNet terlebih dahulu untuk tensorflow_datasets, harap tetapkan variabel lingkungan berikut:
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>
Perintah berikut dapat digunakan untuk melakukan pra-pelatihan ResNet-50 di ImageNet (yang mencerminkan hyperparameter default di makalah kami):
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
Ukuran batch 4096 memerlukan setidaknya 32 TPU. 100 epoch membutuhkan waktu sekitar 6 jam dengan 32 TPU v3s. Perhatikan bahwa kecepatan pembelajaran 0,3 dengan learning_rate_scaling=linear
setara dengan 0,075 dengan learning_rate_scaling=sqrt
ketika ukuran batch adalah 4096. Namun, penggunaan penskalaan sqrt memungkinkannya untuk dilatih lebih baik ketika ukuran batch yang digunakan lebih kecil.
Untuk menyempurnakan head linier (dengan satu GPU), coba perintah berikut:
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
Anda dapat memeriksa hasilnya menggunakan tensorboard, seperti
python -m tensorboard.main --logdir=/tmp/simclr_test
Sebagai referensi, proses CIFAR-10 di atas akan memberi Anda akurasi sekitar 91%, meskipun dapat lebih dioptimalkan.
Untuk menyempurnakan head linier di ImageNet menggunakan Cloud TPU, pertama-tama setel CHKPT_DIR
ke direktori model yang telah dilatih sebelumnya dan setel MODEL_DIR
baru, lalu gunakan perintah berikut:
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
Sebagai referensi, proses di ImageNet di atas akan memberi Anda akurasi sekitar 64,5%.
Anda dapat mengakses 1% dan 10% subset ImageNet yang digunakan untuk pembelajaran semi-supervisi melalui kumpulan data tensorflow: cukup setel dataset=imagenet2012_subset/1pct
dan dataset=imagenet2012_subset/10pct
di baris perintah untuk menyempurnakan subset ini.
Anda juga dapat menemukan ID gambar dari subkumpulan ini di imagenet_subsets/
.
Untuk menyempurnakan seluruh jaringan di ImageNet (1% label), lihat perintah berikut:
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
Tetapkan checkpoint
pada pos-pos yang hanya dilatih sebelumnya tetapi belum disempurnakan. Mengingat bahwa pos pemeriksaan SimCLRv1 tidak berisi head proyeksi, disarankan untuk menjalankan dengan pos pemeriksaan SimCLRv2 (Anda masih dapat menjalankan dengan pos pemeriksaan SimCLRv1, tetapi variable_schema
perlu mengecualikan head
). num_proj_layers
dan ft_proj_selector
perlu disesuaikan mengikuti makalah SimCLRv2 untuk mendapatkan performa terbaik.
Repo ini memberikan solusi untuk mengubah pos pemeriksaan Tensorflow SimCLRv1 yang telah dilatih sebelumnya menjadi pos pemeriksaan Pytorch.
Repo ini memberikan solusi untuk mengubah pos pemeriksaan Tensorflow SimCLRv2 yang telah dilatih sebelumnya menjadi pos pemeriksaan Pytorch.
(Jangan ragu untuk membagikan penerapan Anda dengan membuat masalah)
Implementasi di PyTorch:
Implementasi di Tensorflow 2/Keras (implementasi TF2 resmi ditambahkan di folder tf2/):
Ukuran batch : hasil asli SimCLR disesuaikan dengan ukuran batch yang besar (yaitu 4096), yang menyebabkan hasil kurang optimal ketika pelatihan menggunakan ukuran batch yang lebih kecil. Namun, dengan serangkaian hyper-parameter yang baik (terutama kecepatan pembelajaran, suhu, kedalaman head proyeksi), ukuran batch yang kecil dapat memberikan hasil yang setara dengan ukuran batch yang besar (misalnya, lihat Tabel 2 dalam makalah ini).
Model / Pos Pemeriksaan yang telah dilatih sebelumnya : SimCLRv1 dan SimCLRv2 telah dilatih sebelumnya dengan peluruhan bobot yang berbeda, sehingga model yang telah dilatih sebelumnya dari kedua versi memiliki skala norma bobot yang sangat berbeda (bobot konvolusional di SimCLRv1 ResNet-50 rata-rata 16,8X dari bobot di SimCLRv2). Untuk menyempurnakan model terlatih dari kedua versi, tidak masalah jika Anda menggunakan pengoptimal LARS, namun memerlukan hyperparameter yang sangat berbeda (misalnya kecepatan pembelajaran, peluruhan bobot) jika Anda menggunakan pengoptimal momentum. Jadi untuk kasus terakhir, Anda mungkin ingin mencari hpams yang sangat berbeda sesuai dengan versi yang digunakan, atau menskalakan ulang bobotnya (yaitu konv parameter kernel
base_model
di pos pemeriksaan) untuk memastikannya kira-kira berada dalam skala yang sama .
kertas 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}
}
Kertas 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}
}
Ini bukan produk resmi Google.