消息!我们发布了 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。但是,使用 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
您可以使用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 官方产品。