16-bo‘lim

Tayyor modellar va transfer learning

torchvision.models, ImageNet og'irliklari, backbone ni muzlatish, xususiyat ajratish va fine-tuning o'rtasidagi farq.

🕑 7 daqiqa o‘qish 📄 708 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Tayyor modelni olish
  2. Ikki yondashuv
  3. Backbone ni muzlatish
  4. Kirish talablari
  5. Solishtiramiz
  6. Yangi bosh qo'yish
  7. Xulosa

Har safar modelni noldan o'qitish shart emas. Millionlab rasmda o'qitilgan modellar tayyor turibdi - ulardan foydalanish transfer learning deb ataladi.

Tayyor modelni olish #

Python
import torch
import torch.nn as nn
from torchvision import models

model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
print("resnet18 parametrlari:", f"{sum(p.numel() for p in model.parameters()):,}")
print("oxirgi qatlam (ImageNet uchun):", model.fc)
Natija
resnet18 parametrlari: 11,689,512
oxirgi qatlam (ImageNet uchun): Linear(in_features=512, out_features=1000, bias=True)

11.7 million parametr - bizning CNN dan 570 barobar katta. U ImageNet to'plamida (1.2 million rasm, 1000 sinf) o'qitilgan.

Oxirgi qatlam 1000 ta chiqish beradi, chunki ImageNet da 1000 sinf bor. Bizga esa 10 ta kerak.

ModelParametrlarIzoh
resnet1811.7 MYengil, boshlash uchun yaxshi
resnet5025.6 MAniqroq, sekinroq
efficientnet_b05.3 MKam parametrda yaxshi natija
mobilenet_v3_small2.5 MTelefon va cheklangan qurilmalar uchun

Ikki yondashuv #

Tayyor modeldan foydalanishning ikki yo'li 1. Xususiyat ajratish feature extraction Backbone - MUZLATILGAN requires_grad = False 11.7 M parametr o'zgarmaydi 🔒 Yangi bosh - o'qitiladi Linear(512, 10) = 5 130 Tez, kam ma'lumat yetarli Ma'lumot ImageNet ga o'xshasa - yaxshi 2. Fine-tuning to'liq sozlash Backbone - OCHIQ kichik lr bilan o'qitiladi 11.7 M parametr sozlanadi 🔓 Yangi bosh - o'qitiladi Linear(512, 10) Sekin, ko'proq ma'lumot kerak Ma'lumot boshqacha bo'lsa - shu kerak Odatda 1-usuldan boshlanadi; yetarli bo'lmasa 2-usulga o'tiladi
Backbone o'rgangan umumiy xususiyatlar (qirra, shakl, naqsh) ko'p masalaga yaraydi

Backbone ni muzlatish #

Python
for p in model.parameters():
    p.requires_grad = False

model.fc = nn.Identity()   # 512 o'lchamli xususiyat vektori qaytaradi
model.eval()

nn.Identity() - hech nima qilmaydigan qatlam. Uni qo'yish orqali modelning oxirgi tasniflagichini olib tashlab, xususiyat vektorini olamiz.

Nega requires_grad = False

Bu ikki foyda beradi: gradientlar hisoblanmaydi (tezroq va kam xotira) va og'irliklar o'zgarmaydi. Optimizatorga esa faqat yangi boshning parametrlarini beramiz.

Agar muzlatishni unutsangiz, kichik to'plamda 11.7 million parametr darhol ortiqcha moslashadi.

Kirish talablari #

ImageNet modellari aniq shaklni kutadi:

Python
from torchvision import transforms

imagenet = transforms.Compose([
    transforms.Resize(224),
    transforms.Grayscale(num_output_channels=3),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])
TalabSabab
224x224 o'lchamModel shunday rasmda o'qitilgan
3 ta kanal (RGB)ImageNet rangli rasmlardan iborat
Aniq Normalize qiymatlariImageNet o'rtachasi va og'ishi - o'zgartirmang
Normalize qiymatlarini o'zingiznikiga almashtirmang

[0.485, 0.456, 0.406] va [0.229, 0.224, 0.225] - bu ImageNet to'plamining statistikasi. Model aynan shunday normallangan rasmlarni ko'rib o'qigan.

O'z to'plamingiz qiymatlarini qo'ysangiz, backbone kutilmagan taqsimotli kirish oladi va xususiyatlar sifati pasayadi. Muzlatilgan backbone bilan ishlaganda bu qiymatlar o'zgarmas bo'lishi kerak.

Solishtiramiz #

2000 ta Fashion-MNIST namunasida ikki usulni sinaymiz.

Natija
Xususiyat ajratish (backbone muzlatilgan):
  o'quv: (2000, 512)  56s
  test : (2000, 512)  54s

--- 1) Tayyor xususiyat + Linear ---
   1-davr: yo'qotish=1.0582  aniqlik=72.45%
   5-davr: yo'qotish=0.5551  aniqlik=80.25%
  10-davr: yo'qotish=0.4758  aniqlik=83.40%
  20-davr: yo'qotish=0.4352  aniqlik=84.25%
  o'qitish vaqti: 0.5s

--- 2) Noldan CNN (bir xil 2000 namuna) ---
   1-davr: yo'qotish=0.8701  aniqlik=65.90%
   5-davr: yo'qotish=0.5453  aniqlik=80.50%
  10-davr: yo'qotish=0.5021  aniqlik=82.45%
  20-davr: yo'qotish=0.4792  aniqlik=83.50%
  o'qitish vaqti: 11.4s

--- O'qitiladigan parametrlar ---
Tayyor xususiyat + Linear: 5,130
Noldan CNN:               20,490
Tayyor xususiyatNoldan CNN
Aniqlik (20 davr)84.25%83.50%
O'qitiladigan parametrlar5 13020 490
O'qitish vaqti0.5 s11.4 s
Xususiyat ajratish110 s (bir marta)-

Transfer learning biroz aniqroq chiqdi va o'qitish 20 barobar tez kechdi - chunki faqat 5130 ta parametr sozlandi.

Farq nega bunchalik kichik?

Atigi 0.75 foiz - transfer learning haqidagi maqolalarda bundan ancha katta sakrashlar ko'rsatiladi. Sabablari:

  • Fashion-MNIST kulrang va 28x28 - uni 224 ga cho'zib, uch kanalga nusxalash sun'iy holat. ImageNet esa tabiiy rangli fotosuratlardan iborat.
  • 2000 namuna kichik CNN uchun ham yetarli.
  • Xususiyat ajratishga 110 soniya ketdi - umumiy vaqt bo'yicha ustunlik yo'qoladi.

Transfer learning o'z kuchini tabiiy fotosuratlarda va ma'lumot juda kam bo'lganda (sinfiga 50-100 ta rasm) ko'rsatadi. O'sha yerda farq 10-30 foizga yetadi.

Yangi bosh qo'yish #

Amalda nn.Identity o'rniga to'g'ridan-to'g'ri yangi qatlam qo'yiladi:

Python
model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
for p in model.parameters():
    p.requires_grad = False

model.fc = nn.Linear(512, 10)   # yangi qatlamda requires_grad=True

opt = torch.optim.Adam(
    [p for p in model.parameters() if p.requires_grad],
    lr=0.001,
)

Yangi yaratilgan qatlamda requires_grad sukut bo'yicha True - shuning uchun u muzlatilmaydi.

Fine-tuning ga o'tish tartibi
  1. Avval backbone ni muzlatib, faqat boshni o'qiting.
  2. Natija yetarli bo'lmasa, backbone ni oching.
  3. Kichik lr qo'ying (1e-4 yoki undan kichik).

Katta lr bilan fine-tuning qilsangiz, model ImageNet da o'rgangan hamma narsasini birinchi qadamlardayoq buzib yuboradi. Bu «catastrophic forgetting» deb ataladi.

Amaliy topshiriq
  1. resnet18 ni tayyor og'irliklar bilan yuklab, parametrlar sonini chop eting.
  2. Uning oxirgi qatlami nechta chiqish berishini va nega shundayligini tushuntiring.
  3. Barcha parametrlarni muzlatib, requires_grad holatini tekshiring.
  4. model.fc ni nn.Identity() ga almashtirib, chiqish o'lchamini ko'ring.
  5. ImageNet uchun kerakli transforms.Compose ni yozing.
  6. 224x224 va 3 kanal nega talab qilinishini tushuntiring.
  7. 2000 namunadan xususiyat ajratib, shaklini tekshiring.
  8. Linear(512, 10) ni o'qitib, aniqlikni o'lchang.
  9. Xuddi shu ma'lumotda noldan CNN o'qitib, ikkalasini solishtiring.
  10. Har ikki usulda o'qitiladigan parametrlar sonini hisoblang.

Xulosa #

  • Transfer learning - tayyor o'qitilgan modelning bilimidan foydalanish.
  • torchvision.models ImageNet da o'qitilgan modellarni beradi.
  • resnet18 da 11.7 million parametr bor - bizning CNN dan 570 barobar ko'p.
  • Ikki yondashuv: xususiyat ajratish (backbone muzlatilgan) va fine-tuning (hammasi o'qitiladi).
  • Muzlatish p.requires_grad = False bilan qilinadi.
  • Oxirgi qatlam masalangizga mos qilib almashtiriladi: model.fc = nn.Linear(512, 10).
  • ImageNet modellari 224x224, 3 kanalli va aniq Normalize qiymatlari bilan ishlaydi.
  • Bizning o'lchovda transfer learning 84.25% berdi, noldan CNN 83.50%.
  • Asosiy yutuq aniqlikda emas: 5130 parametr va 20 barobar tez o'qitish.
  • Farq kichik bo'lishining sababi - kulrang 28x28 rasmlar ImageNet ga o'xshamaydi.

Keyingi bo'limda matn bilan ishlashga o'tamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.