¡Noticias! Hemos lanzado una implementación TF2 de SimCLR (junto con puntos de control convertidos en TF2), están en la carpeta tf2/.
¡Noticias! Se agregan colaboraciones para propiedades intrigantes de pérdidas contrastivas, ver aquí.
Aquí publicamos un total de 65 modelos previamente entrenados, correspondientes a los de la Tabla 1 del documento SimCLRv2:
Profundidad | Ancho | SK | Parámetro (M) | PJ (1%) | PJ(10%) | PJ(100%) | evaluación lineal | supervisado |
---|---|---|---|---|---|---|---|---|
50 | 1X | FALSO | 24 | 57,9 | 68,4 | 76,3 | 71,7 | 76,6 |
50 | 1X | Verdadero | 35 | 64,5 | 72.1 | 78,7 | 74,6 | 78,5 |
50 | 2X | FALSO | 94 | 66.3 | 73,9 | 79.1 | 75,6 | 77,8 |
50 | 2X | Verdadero | 140 | 70,6 | 77.0 | 81.3 | 77,7 | 79,3 |
101 | 1X | FALSO | 43 | 62.1 | 71,4 | 78.2 | 73,6 | 78.0 |
101 | 1X | Verdadero | 65 | 68.3 | 75.1 | 80,6 | 76,3 | 79,6 |
101 | 2X | FALSO | 170 | 69.1 | 75,8 | 80,7 | 77.0 | 78,9 |
101 | 2X | Verdadero | 257 | 73.2 | 78,8 | 82,4 | 79.0 | 80.1 |
152 | 1X | FALSO | 58 | 64.0 | 73.0 | 79,3 | 74,5 | 78,3 |
152 | 1X | Verdadero | 89 | 70.0 | 76,5 | 81.3 | 77,2 | 79,9 |
152 | 2X | FALSO | 233 | 70.2 | 76,6 | 81.1 | 77,4 | 79.1 |
152 | 2X | Verdadero | 354 | 74.2 | 79,4 | 82,9 | 79,4 | 80,4 |
152 | 3X | Verdadero | 795 | 74,9 | 80.1 | 83.1 | 79,8 | 80,5 |
Estos puntos de control se almacenan en Google Cloud Storage:
También proporcionamos ejemplos sobre cómo utilizar los puntos de control en la carpeta colabs/
.
Los modelos previamente entrenados (red base con capa clasificadora lineal) se pueden encontrar a continuación. Tenga en cuenta que para estos puntos de control SimCLRv1, el cabezal de proyección no está disponible.
Punto de control del modelo y módulo central. | ImageNet Top-1 |
---|---|
ResNet50 (1x) | 69.1 |
ResNet50 (2x) | 74.2 |
ResNet50 (4x) | 76,6 |
Hay puntos de control adicionales de SimCLRv1 disponibles: gs://simclr-checkpoints/simclrv1.
Una nota sobre las firmas del módulo TensorFlow Hub: default
es la salida de representación de la red base; logits_sup
son los logits de clasificación supervisados para las categorías de ImageNet 1000. Otros (por ejemplo, initial_max_pool
, block_group1
) son capas intermedias de ResNet; consulte resnet.py para obtener más detalles. Consulte este tutorial para obtener información adicional sobre el uso de los módulos TensorFlow Hub.
Nuestros modelos están entrenados con TPU. Se recomienda ejecutar capacitación distribuida con TPU cuando se utiliza nuestro código para la capacitación previa.
Nuestro código también puede ejecutarse en una sola GPU. No admite múltiples GPU, por motivos como BatchNorm global y pérdida de contraste entre núcleos.
El código es compatible con TensorFlow v1 y v2. Consulte requisitos.txt para conocer todos los requisitos previos y también puede instalarlos usando el siguiente comando.
pip install -r requirements.txt
Para entrenar previamente el modelo en CIFAR-10 con una sola GPU, pruebe el siguiente comando:
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
Para entrenar previamente el modelo en ImageNet con Cloud TPU, primero consulte el tutorial de Google Cloud TPU para obtener información básica sobre cómo usar Google Cloud TPU.
Una vez que haya creado la máquina virtual con Cloud TPU y haya descargado previamente los datos de ImageNet para tensorflow_datasets, configure las siguientes variables de entorno:
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>
El siguiente comando se puede utilizar para entrenar previamente un ResNet-50 en ImageNet (que refleja los hiperparámetros predeterminados en nuestro artículo):
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
Un tamaño de lote de 4096 requiere al menos 32 TPU. 100 épocas tardan alrededor de 6 horas con 32 TPU v3. Tenga en cuenta que la tasa de aprendizaje de 0,3 con learning_rate_scaling=linear
es equivalente a la de 0,075 con learning_rate_scaling=sqrt
cuando el tamaño del lote es 4096. Sin embargo, el uso de la escala sqrt le permite entrenar mejor cuando se utiliza un tamaño de lote más pequeño.
Para ajustar un cabezal lineal (con una sola GPU), pruebe el siguiente comando:
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
Puede comprobar los resultados utilizando tensorboard, como
python -m tensorboard.main --logdir=/tmp/simclr_test
Como referencia, las ejecuciones anteriores en CIFAR-10 deberían brindarle alrededor del 91% de precisión, aunque se puede optimizar aún más.
Para ajustar un cabezal lineal en ImageNet usando Cloud TPU, primero configure CHKPT_DIR
en el directorio del modelo previamente entrenado y configure un nuevo MODEL_DIR
, luego use el siguiente comando:
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
Como referencia, las ejecuciones anteriores en ImageNet deberían brindarle alrededor del 64,5% de precisión.
Puede acceder a subconjuntos de ImageNet del 1% y 10% utilizados para el aprendizaje semisupervisado a través de conjuntos de datos de tensorflow: simplemente configure dataset=imagenet2012_subset/1pct
y dataset=imagenet2012_subset/10pct
en la línea de comando para realizar ajustes en estos subconjuntos.
También puede encontrar los ID de imagen de estos subconjuntos en imagenet_subsets/
.
Para ajustar toda la red en ImageNet (1% de las etiquetas), consulte el siguiente comando:
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
Establezca el checkpoint
en aquellos que solo estén previamente entrenados pero no ajustados. Dado que los puntos de control SimCLRv1 no contienen cabezal de proyección, se recomienda ejecutar con puntos de control SimCLRv2 (aún puede ejecutar con puntos de control SimCLRv1, pero variable_schema
debe excluir head
). num_proj_layers
y ft_proj_selector
deben ajustarse en consecuencia siguiendo el documento SimCLRv2 para obtener el mejor rendimiento.
Este repositorio proporciona una solución para convertir los puntos de control de Tensorflow SimCLRv1 previamente entrenados en puntos de Pytorch.
Este repositorio proporciona una solución para convertir los puntos de control de Tensorflow SimCLRv2 previamente entrenados en puntos de Pytorch.
(No dude en compartir su implementación creando un problema)
Implementaciones en PyTorch:
Implementaciones en Tensorflow 2/Keras (la implementación oficial de TF2 se agregó en la carpeta tf2/):
Tamaño de lote : los resultados originales de SimCLR se ajustaron con un tamaño de lote grande (es decir, 4096), lo que conduce a resultados subóptimos cuando se entrena con un tamaño de lote más pequeño. Sin embargo, con un buen conjunto de hiperparámetros (principalmente tasa de aprendizaje, temperatura, profundidad del cabezal de proyección), los tamaños de lotes pequeños pueden producir resultados que están a la par con los tamaños de lotes grandes (por ejemplo, consulte la Tabla 2 en este documento).
Modelos previamente entrenados/puntos de control : SimCLRv1 y SimCLRv2 están previamente entrenados con diferentes decaimientos de peso, por lo que los modelos previamente entrenados de las dos versiones tienen escalas de normas de peso muy diferentes (los pesos convolucionales en SimCLRv1 ResNet-50 son en promedio 16,8 veces mayores que en SimCLRv2). Para ajustar los modelos previamente entrenados de ambas versiones, está bien si usa un optimizador LARS, pero requiere hiperparámetros muy diferentes (por ejemplo, tasa de aprendizaje, disminución de peso) si usa el optimizador de impulso. Entonces, para el último caso, es posible que desee buscar hparams muy diferentes según la versión utilizada, o volver a escalar el peso (es decir, los parámetros conv kernel
de base_model
en los puntos de control) para asegurarse de que estén aproximadamente en la misma escala. .
Papel 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}
}
Documento 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}
}
Este no es un producto oficial de Google.