16-bo‘lim
Tayyor modellar va transfer learning
torchvision.models, ImageNet og'irliklari, backbone ni muzlatish, xususiyat ajratish va fine-tuning o'rtasidagi farq.
Ushbu bo‘lim mundarijasi
Har safar modelni noldan o'qitish shart emas. Millionlab rasmda o'qitilgan modellar tayyor turibdi - ulardan foydalanish transfer learning deb ataladi.
Tayyor modelni olish #
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)
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.
| Model | Parametrlar | Izoh |
|---|---|---|
resnet18 | 11.7 M | Yengil, boshlash uchun yaxshi |
resnet50 | 25.6 M | Aniqroq, sekinroq |
efficientnet_b0 | 5.3 M | Kam parametrda yaxshi natija |
mobilenet_v3_small | 2.5 M | Telefon va cheklangan qurilmalar uchun |
Ikki yondashuv #
Backbone ni muzlatish #
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.
requires_grad = FalseBu 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:
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]),
])
| Talab | Sabab |
|---|---|
| 224x224 o'lcham | Model shunday rasmda o'qitilgan |
| 3 ta kanal (RGB) | ImageNet rangli rasmlardan iborat |
Aniq Normalize qiymatlari | ImageNet 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.
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 xususiyat | Noldan CNN | |
|---|---|---|
| Aniqlik (20 davr) | 84.25% | 83.50% |
| O'qitiladigan parametrlar | 5 130 | 20 490 |
| O'qitish vaqti | 0.5 s | 11.4 s |
| Xususiyat ajratish | 110 s (bir marta) | - |
Transfer learning biroz aniqroq chiqdi va o'qitish 20 barobar tez kechdi - chunki faqat 5130 ta parametr sozlandi.
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:
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.
- Avval backbone ni muzlatib, faqat boshni o'qiting.
- Natija yetarli bo'lmasa, backbone ni oching.
- Kichik
lrqo'ying (1e-4yoki undan kichik).
Katta lr bilan fine-tuning qilsangiz, model ImageNet da o'rgangan
hamma narsasini birinchi qadamlardayoq buzib yuboradi. Bu «catastrophic
forgetting» deb ataladi.
resnet18ni tayyor og'irliklar bilan yuklab, parametrlar sonini chop eting.- Uning oxirgi qatlami nechta chiqish berishini va nega shundayligini tushuntiring.
- Barcha parametrlarni muzlatib,
requires_gradholatini tekshiring. model.fcninn.Identity()ga almashtirib, chiqish o'lchamini ko'ring.- ImageNet uchun kerakli
transforms.Composeni yozing. - 224x224 va 3 kanal nega talab qilinishini tushuntiring.
- 2000 namunadan xususiyat ajratib, shaklini tekshiring.
Linear(512, 10)ni o'qitib, aniqlikni o'lchang.- Xuddi shu ma'lumotda noldan CNN o'qitib, ikkalasini solishtiring.
- Har ikki usulda o'qitiladigan parametrlar sonini hisoblang.
Xulosa #
- Transfer learning - tayyor o'qitilgan modelning bilimidan foydalanish.
torchvision.modelsImageNet da o'qitilgan modellarni beradi.resnet18da 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 = Falsebilan qilinadi. - Oxirgi qatlam masalangizga mos qilib almashtiriladi:
model.fc = nn.Linear(512, 10). - ImageNet modellari 224x224, 3 kanalli va aniq
Normalizeqiymatlari 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.