Thuta Learning
Computer Vision
IntermediateAIintermediate

Vision အတွက် Transfer Learning

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Vision အတွက် Transfer Learning concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

Transfer learning ၏ အခြေခံ insight မှာ large dataset (ImageNet ကဲ့သို့) ပေါ်တွင် train ပြီးသား CNN တစ်ခု၏ early/middle layer များသည် task-specific မဟုတ်သေးသော general visual feature (edge, texture, shape, color gradient) များကို ထုတ်ပေးနေခြင်းဖြစ်သည်။ ဒီလို general feature တွေကို photograph ရဲ့ vision task အားလုံးနီးပါးမှာ ပြန်လည် အသုံးပြုနိုင်ကြောင်းက empirical fact တစ်ခုဖြစ်သည် — cat ကို classify ဖို့ သင်ယူထားတဲ့ edge detector တစ်ခုဟာ car ကို classify ဖို့လည်း အသုံးဝင်တတ်တယ်။ Parameter များကို requires_grad = False ဖြင့် freeze လုပ်ခြင်းအားဖြင့် backward pass အတွင်း ဒီ layer တွေအတွက် gradient ကို မတွက်ချက်တော့သောကြောင့် training သည် ပိုမြန်ဆန်ပြီး memory ပိုသက်သာသည်၊ ထို့အပြင် small dataset တစ်ခုတည်းဖြင့် deep network တစ်ခုလုံးကို scratch ကနေ train လုပ်ရင် ဖြစ်တတ်တဲ့ overfitting ကိုလည်း ရှောင်ရှားနိုင်သည်။

နောက်ဆုံးတွင် model.fc ကို Linear layer အသစ်တစ်ခုနှင့် အစားထိုးလိုက်ခြင်းက network ၏ 'decision head' ကိုသာ ပြန်လည် ပြင်ဆင်ပေးလိုက်ခြင်းဖြစ်သည် — feature extractor (convolutional backbone) ကို ImageNet ၏ 1000 class အတွက် သင်ယူထားတာအတိုင်း ဆက်ထားပြီး၊ classifier head တစ်ခုတည်းကိုသာ target task ၏ class အရေအတွက်နှင့် ကိုက်ညီအောင် အသစ်လဲလိုက်ခြင်းဖြစ်သည်။ Trainable parameter များမှာ ဒီ layer အသစ်ရဲ့ weight/bias များသာ ကျန်တော့သောကြောင့် ImageNet-scale dataset မလိုအပ်တော့ဘဲ image အနည်းငယ်ဖြင့်ပင် ကောင်းမွန်သော accuracy ရနိုင်သည်။

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Tutorial Platform တွင် user profile avatar image များအား upload လုပ်ချိန်တွင် inappropriate/NSFW content ပါ၊ မပါ စစ်ဆေးမည့် moderation feature တစ်ခု လိုအပ်သည်ဆိုပါစို့။ Scratch ကနေ classifier တစ်ခု train လုပ်ဖို့ label တပ်ထားတဲ့ image ထောင်ပေါင်းများစွာ လိုအပ်မည့်အစား၊ pretrained ResNet18 ကို freeze လုပ်ပြီး fc layer ကိုသာ binary (appropriate/inappropriate) output အတွက် swap လုပ်ခြင်းဖြင့် avatar sample အတော်နည်းသော dataset ဖြင့်ပင် စတင် prototype လုပ်နိုင်သည်။

အတူတူ စမ်းရေးကြည့်မယ်

python
import torch
import torch.nn as nn
import torchvision.models as models
from torchvision.models import ResNet18_Weights

model = models.resnet18(weights=ResNet18_Weights.DEFAULT)

# Freeze the pretrained backbone
for param in model.parameters():
    param.requires_grad = False

# Replace the final classification layer for a new task with 5 classes
num_classes = 5
model.fc = nn.Linear(model.fc.in_features, num_classes)

trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
frozen = sum(p.numel() for p in model.parameters() if not p.requires_grad)

print(f"trainable parameters: {trainable}")
print(f"frozen parameters: {frozen}")
print(f"total parameters: {trainable + frozen}")
You should see
'trainable parameters:', 'frozen parameters:', 'total parameters:' ဟု line သုံးကြောင်း print ထုတ်မည်။ Trainable count သည် အသစ်ထည့်သွင်းလိုက်သည့် fc Linear layer (512 in_features × 5 classes + bias 5 = 2,565) ၏ parameter အရေအတွက်ချည်းသာ ဖြစ်ပြီး၊ frozen count သည် ResNet18 backbone ၏ ကျန်ရှိအားလုံး (approximately ၁၁ သန်းကျော်) ဖြစ်လိမ့်မည် — trainable parameter သည် total ၏ အလွန်နည်းငယ်သောရာခိုင်နှုန်းသာ ဖြစ်သည်ကို တွေ့ရမည်။

၅ မိနစ် စမ်းကြည့်

model.fc အပြင် model.layer4 (ResNet18 ၏ နောက်ဆုံး convolutional block) ရှိ parameter များကိုပါ requires_grad = True ပြန်ထားခြင်းဖြင့် 'partial fine-tuning' လုပ်ကြည့်ပါ၊ ပြီးလျှင် trainable parameter count ဘယ်လောက် တိုးလာသလဲကို print ထုတ်ကြည့်ပါ။

သတိလေးတစ်ချက်

ResNet18_Weights.DEFAULT ဖြင့် pretrained weight ကို ပထမဆုံးအကြိမ် download ရန် internet connection လိုအပ်ပြီး offline environment တွင် ဒီ code သည် error တက်လိမ့်မည် (weights=None ဖြင့်သာ architecture skeleton ကို offline ရနိုင်သည်)။

model.fc ကို အစားထိုးလိုက်ပြီးမှ optimizer ကို train လုပ်တဲ့အခါ model.parameters() အားလုံးကို optimizer ထဲ ထည့်လိုက်မိလျှင် (filter(lambda p: p.requires_grad, ...) မလုပ်ဘဲ) frozen parameter များပါ optimizer state ထဲ ပါဝင်သွားပြီး memory အလကားကုန်နိုင်သည်။

PyTorch Tutorials — Transfer Learning for Computer VisionComputer Vision

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • ResNet18_Weights.DEFAULT ဖြင့် pretrained weight ကို ပထမဆုံးအကြိမ် download ရန် internet connection လိုအပ်ပြီး offline environment တွင် ဒီ code သည် error တက်လိမ့်မည် (weights=None ဖြင့်သာ architecture skeleton ကို offline ရနိုင်သည်)။
  • model.fc ကို အစားထိုးလိုက်ပြီးမှ optimizer ကို train လုပ်တဲ့အခါ model.parameters() အားလုံးကို optimizer ထဲ ထည့်လိုက်မိလျှင် (filter(lambda p: p.requires_grad, ...) မလုပ်ဘဲ) frozen parameter များပါ optimizer state ထဲ ပါဝင်သွားပြီး memory အလကားကုန်နိုင်သည်။
  • နမူနာ code ကို production system ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test environment တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

model.fc အပြင် model.layer4 (ResNet18 ၏ နောက်ဆုံး convolutional block) ရှိ parameter များကိုပါ requires_grad = True ပြန်ထားခြင်းဖြင့် 'partial fine-tuning' လုပ်ကြည့်ပါ၊ ပြီးလျှင် trainable parameter count ဘယ်လောက် တိုးလာသလဲကို print ထုတ်ကြည့်ပါ။

You'll know it worked when: 'trainable parameters:', 'frozen parameters:', 'total parameters:' ဟု line သုံးကြောင်း print ထုတ်မည်။ Trainable count သည် အသစ်ထည့်သွင်းလိုက်သည့် fc Linear layer (512 in_features × 5 classes + bias 5 = 2,565) ၏ parameter အရေအတွက်ချည်းသာ ဖြစ်ပြီး၊ frozen count သည် ResNet18 backbone ၏ ကျန်ရှိအားလုံး (approximately ၁၁ သန်းကျော်) ဖြစ်လိမ့်မည် — trainable parameter သည် total ၏ အလွန်နည်းငယ်သောရာခိုင်နှုန်းသာ ဖြစ်သည်ကို တွေ့ရမည်။

Vision အတွက် Transfer Learning | Thuta Learning