أخبار! لقد أصدرنا تطبيق TF2 لـ SimCLR (جنبًا إلى جنب مع نقاط التفتيش المحولة في TF2)، وهي موجودة في مجلد tf2/.
أخبار! تمت إضافة Colabs للخصائص المثيرة للخسائر المتباينة، انظر هنا.
لقد قمنا بفتح 65 نموذجًا مدربًا مسبقًا هنا، بما يتوافق مع تلك الموجودة في الجدول 1 من ورقة SimCLRv2:
عمق | عرض | كورونا | بارام (م) | قدم (1%) | قدم (10%) | قدم (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/
folder.
يمكن العثور على النماذج المدربة مسبقًا (الشبكة الأساسية مع طبقة المصنف الخطية) أدناه. لاحظ أنه بالنسبة لنقاط فحص SimCLRv1 هذه، فإن رأس الإسقاط غير متاح.
نقطة التفتيش النموذجية ووحدة المحور | إيماج نت توب-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 عند استخدام الكود الخاص بنا للتدريب المسبق.
يمكن أيضًا تشغيل الكود الخاص بنا على وحدة معالجة رسومات واحدة . لا يدعم وحدات معالجة الرسومات المتعددة، لأسباب مثل BatchNorm العالمي والخسارة المتباينة عبر النوى.
الكود متوافق مع كل من TensorFlow v1 و v2. راجع Requirements.txt للتعرف على كافة المتطلبات الأساسية، ويمكنك أيضًا تثبيتها باستخدام الأمر التالي.
pip install -r requirements.txt
للتدريب المسبق للنموذج على 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
للتدريب المسبق للنموذج على ImageNet باستخدام وحدات TPU السحابية، راجع أولاً البرنامج التعليمي لـ Google Cloud TPU للحصول على معلومات أساسية حول كيفية استخدام وحدات TPU السحابية من Google.
بمجرد إنشاء جهاز افتراضي باستخدام Cloud TPUs، وتنزيل بيانات ImageNet مسبقًا لـ Tensorflow_datasets، يرجى تعيين متغيرات البيئة التالية:
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>
يمكن استخدام الأمر التالي للتدريب المسبق لـ ResNet-50 على ImageNet (والذي يعكس المعلمات الفائقة الافتراضية في ورقتنا):
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. تستغرق 100 فترة حوالي 6 ساعات مع 32 إصدارًا من مادة TPU. لاحظ أن معدل التعلم البالغ 0.3 مع learning_rate_scaling=linear
يعادل 0.075 مع learning_rate_scaling=sqrt
عندما يكون حجم الدُفعة 4096. ومع ذلك، فإن استخدام مقياس sqrt يسمح لها بالتدريب بشكل أفضل عند استخدام حجم دفعة أصغر.
لضبط الرأس الخطي (باستخدام وحدة معالجة رسومات واحدة)، جرّب الأمر التالي:
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%، على الرغم من إمكانية تحسينها بشكل أكبر.
لضبط الرأس الخطي على ImageNet باستخدام Cloud TPUs، قم أولاً بتعيين CHKPT_DIR
على نموذج تم تدريبه مسبقًا 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 الفرعية المستخدمة للتعلم شبه الخاضع للإشراف عبر مجموعات بيانات Tensorflow: ما عليك سوى تعيين dataset=imagenet2012_subset/1pct
و dataset=imagenet2012_subset/10pct
في سطر الأوامر لضبط هذه المجموعات الفرعية.
يمكنك أيضًا العثور على معرفات الصور لهذه المجموعات الفرعية في imagenet_subsets/
.
لضبط الشبكة بالكامل على 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
). يجب تعديل 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 تبلغ في المتوسط 16.8X من تلك الموجودة في SimCLRv2). لضبط النماذج المدربة مسبقًا من كلا الإصدارين، لا بأس إذا كنت تستخدم محسن LARS، ولكنه يتطلب معلمات تشعبية مختلفة جدًا (مثل معدل التعلم، وتناقص الوزن) إذا كنت تستخدم محسن الزخم. لذلك بالنسبة للحالة الأخيرة، قد ترغب إما في البحث عن hparams مختلفة تمامًا وفقًا للإصدار المستخدم، أو إعادة قياس الوزن (أي معلمات تحويل kernel
الخاصة بـ base_model
في نقاط التفتيش) للتأكد من أنها بنفس المقياس تقريبًا .
ورقة 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 الرسمية.