ข่าว! เราได้เปิดตัวการใช้งาน TF2 ของ SimCLR (พร้อมกับจุดตรวจสอบที่แปลงแล้วใน TF2) ซึ่งอยู่ในโฟลเดอร์ tf2/
ข่าว! มีการเพิ่ม Colabs สำหรับคุณสมบัติที่น่าสนใจของการสูญเสียแบบตรงกันข้าม ดูที่นี่
เราโอเพ่นซอร์สโมเดลที่ได้รับการฝึกล่วงหน้าทั้งหมด 65 โมเดลที่นี่ ซึ่งสอดคล้องกับที่อยู่ในตารางที่ 1 ของเอกสาร SimCLRv2:
ความลึก | ความกว้าง | เอสเค | พารามิเตอร์ (M) | ฟุต (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/
โฟลเดอร์อีกด้วย
คุณสามารถดูโมเดลที่ได้รับการฝึกล่วงหน้า (เครือข่ายพื้นฐานพร้อมเลเยอร์ตัวแยกประเภทเชิงเส้น) ได้ที่ด้านล่างนี้ โปรดทราบว่าสำหรับจุดตรวจสอบ 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 เมื่อใช้โค้ดของเราสำหรับการฝึกอบรมล่วงหน้า
รหัสของเราสามารถทำงานบน GPU ตัวเดียว ได้ ไม่รองรับ Multi-GPU ด้วยเหตุผลต่างๆ เช่น BatchNorm ทั่วโลกและการสูญเสียที่ตรงกันข้ามระหว่างคอร์
รหัสนี้เข้ากันได้กับทั้ง TensorFlow v1 และ v2 ดูข้อกำหนด.txtสำหรับข้อกำหนดเบื้องต้นทั้งหมด และคุณยังสามารถติดตั้งได้โดยใช้คำสั่งต่อไปนี้
pip install -r requirements.txt
หากต้องการฝึกโมเดลล่วงหน้าบน CIFAR-10 ด้วย GPU ตัวเดียว ให้ลองใช้คำสั่งต่อไปนี้:
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 ด้วย Cloud TPU ขั้นแรกให้ดูบทช่วยสอน Google Cloud TPU เพื่อดูข้อมูลพื้นฐานเกี่ยวกับวิธีใช้ Google Cloud TPU
เมื่อคุณสร้างเครื่องเสมือนด้วย Cloud TPU และดาวน์โหลดข้อมูล 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 ต้องใช้ TPU อย่างน้อย 32 ตัว 100 ยุคใช้เวลาประมาณ 6 ชั่วโมงด้วย 32 TPU v3 โปรดทราบว่าอัตราการเรียนรู้ 0.3 ด้วย learning_rate_scaling=linear
เทียบเท่ากับ 0.075 ด้วย learning_rate_scaling=sqrt
เมื่อขนาดแบตช์คือ 4096 อย่างไรก็ตาม การใช้การปรับสเกล 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% แม้ว่าจะสามารถปรับให้เหมาะสมเพิ่มเติมได้ก็ตาม
สำหรับการปรับแต่งส่วนหัวเชิงเส้นบน ImageNet โดยใช้ Cloud TPU ขั้นแรกให้ตั้งค่า 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%
คุณสามารถเข้าถึงชุดย่อย ImageNet 1% และ 10% ที่ใช้สำหรับการเรียนรู้แบบกึ่งกำกับดูแลผ่านชุดข้อมูล tensorflow: เพียงตั้งค่า dataset=imagenet2012_subset/1pct
และ dataset=imagenet2012_subset/10pct
ในบรรทัดคำสั่งเพื่อปรับแต่งชุดย่อยเหล่านี้อย่างละเอียด
คุณยังสามารถค้นหา ID รูปภาพของชุดย่อยเหล่านี้ได้ใน 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 เพื่อให้ได้ประสิทธิภาพที่ดีที่สุด
Repo นี้มอบโซลูชันสำหรับการแปลงจุดตรวจสอบ SimCLRv1 Tensorflow ที่ได้รับการฝึกไว้ล่วงหน้าไปเป็น Pytorch
Repo นี้มอบโซลูชันสำหรับการแปลงจุดตรวจสอบ SimCLRv2 Tensorflow ที่ได้รับการฝึกไว้ล่วงหน้าไปเป็น Pytorch
(อย่าลังเลที่จะแบ่งปันการใช้งานของคุณโดยการสร้างปัญหา)
การใช้งานใน PyTorch:
การใช้งานใน Tensorflow 2 / Keras (มีการเพิ่มการใช้งาน TF2 อย่างเป็นทางการใน tf2/ โฟลเดอร์):
ขนาดชุดงาน : ผลลัพธ์ดั้งเดิมของ SimCLR ได้รับการปรับแต่งภายใต้ขนาดชุดงานขนาดใหญ่ (เช่น 4096) ซึ่งนำไปสู่ผลลัพธ์ที่ต่ำกว่าปกติเมื่อฝึกโดยใช้ขนาดชุดงานเล็กลง อย่างไรก็ตาม ด้วยชุดไฮเปอร์พารามิเตอร์ที่ดี (ส่วนใหญ่เป็นอัตราการเรียนรู้ อุณหภูมิ ความลึกของหัวฉายภาพ) ขนาดชุดเล็กสามารถให้ผลลัพธ์ที่พอๆ กับขนาดชุดใหญ่ (เช่น ดูตารางที่ 2 ในบทความนี้)
โมเดลที่ฝึกไว้ล่วงหน้า / จุดตรวจสอบ : SimCLRv1 และ SimCLRv2 ได้รับการฝึกไว้ล่วงหน้าโดยมีการสลายตัวของน้ำหนักที่แตกต่างกัน ดังนั้นโมเดลที่ฝึกไว้ล่วงหน้าจากทั้งสองเวอร์ชันจึงมีมาตราส่วนน้ำหนักที่แตกต่างกันมาก (น้ำหนักแบบ Convolutional ใน SimCLRv1 ResNet-50 โดยเฉลี่ยอยู่ที่ 16.8 เท่าของน้ำหนักใน SimCLRv2) สำหรับการปรับแต่งโมเดลที่ฝึกไว้ล่วงหน้าจากทั้งสองเวอร์ชันอย่างละเอียด จะเป็นเรื่องปกติหากคุณใช้เครื่องมือเพิ่มประสิทธิภาพ LARS แต่ต้องใช้ไฮเปอร์พารามิเตอร์ที่แตกต่างกันมาก (เช่น อัตราการเรียนรู้ น้ำหนักลดลง) หากคุณใช้เครื่องมือเพิ่มประสิทธิภาพโมเมนตัม ดังนั้นในกรณีหลัง คุณอาจต้องการค้นหา hparams ที่แตกต่างกันมากตามเวอร์ชันที่ใช้ หรือปรับขนาดน้ำหนักใหม่ (เช่น พารามิเตอร์ kernel
conv ของ 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