15-bo‘lim
Normallash va ma'lumotni kengaytirish
transforms.Compose, Normalize, RandomHorizontalFlip va RandomAffine, kengaytirishning haqiqiy ta'siri o'lchanadi.
Ushbu bo‘lim mundarijasi
Ma'lumotni modelga berishdan oldin ikkita narsa qilish mumkin: normallash (qiymatlarni qulay oraliqqa keltirish) va kengaytirish (mavjud rasmlardan yangi variantlar yasash).
Normallash #
Avval to'plamning o'rtachasi va standart og'ishini hisoblaymiz:
import torch
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
xom = datasets.FashionMNIST("./data", train=True, download=False,
transform=transforms.ToTensor())
yuk = DataLoader(xom, batch_size=1024)
s = ss = n = 0.0
for xb, _ in yuk:
s += xb.mean().item() * len(xb)
ss += xb.std().item() * len(xb)
n += len(xb)
ortacha, ogish = s / n, ss / n
print(f"to'plam o'rtachasi: {ortacha:.4f} standart og'ish: {ogish:.4f}")
to'plam o'rtachasi: 0.2860 standart og'ish: 0.3530
Endi Normalize qo'llaymiz:
x, _ = xom[0]
print(f"ToTensor: min={x.min():.3f} max={x.max():.3f} mean={x.mean():.3f}")
xn = transforms.Normalize((ortacha,), (ogish,))(x)
print(f"Normalize: min={xn.min():.3f} max={xn.max():.3f} mean={xn.mean():.3f}")
ToTensor: min=0.000 max=1.000 mean=0.381
Normalize: min=-0.810 max=2.023 mean=0.270
Normalize har pikseldan o'rtachani ayiradi va og'ishga bo'ladi:
(x - o'rtacha) / og'ish. Natijada qiymatlar taxminan 0 atrofida
joylashadi va manfiy ham bo'ladi.
Kirish 0 atrofida bo'lsa, gradientlar barqarorroq bo'ladi va optimizator
tezroq yaqinlashadi. ReLU va boshqa faollashtirish funksiyalari ham aynan
shu oraliqda yaxshi ishlaydi.
Muhim shart: o'rtacha va og'ish faqat o'quv to'plamidan hisoblanadi, keyin esa test to'plamiga ham o'sha qiymatlar qo'llanadi. Testdan hisoblasangiz, bu ma'lumot sizib chiqishi bo'ladi.
Kengaytirish (augmentation) #
Kengaytirish har safar rasmni biroz o'zgartirib beradi - burish, siljitish, aks ettirish. Model har davrda biroz boshqacha rasm ko'radi:
oddiy = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((ortacha,), (ogish,)),
])
kengaytirilgan = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomAffine(degrees=10, translate=(0.1, 0.1)),
transforms.ToTensor(),
transforms.Normalize((ortacha,), (ogish,)),
])
Bir xil rasmni uch marta o'qib ko'ramiz:
Bir xil rasm 3 marta kengaytirilganda:
1: mean=+0.2107 std=1.1329 nolmas piksellar=404
2: mean=+0.2750 std=1.1314 nolmas piksellar=435
3: mean=+0.2631 std=1.1357 nolmas piksellar=423
Uch marta - uch xil natija. To'plamda hamon 3000 ta rasm bor, lekin model ularning cheksiz variantini ko'radi.
RandomHorizontalFlip va RandomAffine PIL rasm bilan ishlaydi,
Normalize esa tenzor bilan. Shuning uchun tartib har doim shunday:
- Tasodifiy o'zgarishlar (flip, affine, crop)
ToTensor()Normalize(...)
ToTensor() dan keyin RandomHorizontalFlip qo'ysangiz, xato chiqadi
yoki o'zgarish qo'llanmay qoladi.
Qaysi o'zgarishni tanlash #
| O'zgarish | Nima qiladi | Ehtiyot |
|---|---|---|
RandomHorizontalFlip | Chap-o'ngga aks ettiradi | Matn va raqamlarda ishlatmang |
RandomVerticalFlip | Yuqori-pastga ag'daradi | Kiyim va yuzlarda mantiqsiz |
RandomAffine | Buradi, siljitadi, cho'zadi | Burchakni kichik tuting (5-15 daraja) |
RandomCrop | Qismini kesib oladi | padding bilan birga ishlatiladi |
ColorJitter | Yorqinlik va kontrastni o'zgartiradi | Kulrang rasmda ta'siri kam |
Fashion-MNIST uchun gorizontal aks ettirish mantiqiy - teskari qaragan krossovka baribir krossovka.
Lekin raqamlar to'plamida buni qilsangiz, 2 aks ettirilganda 2 bo'lib qolmaydi, model esa uni hamon «2» deb o'rganadi. Bu ma'lumotni buzish bo'ladi.
Savol oddiy: o'zgargan rasmga odam qarasa, javobi o'sha bo'lib qoladimi?
Haqiqiy ta'sirini o'lchaymiz #
3000 ta namunada bir xil CNN ni ikki xil sharoitda o'qitamiz:
--- 3000 namuna, bir xil urug' ---
Usul | Davr | Test yo'q. | Test aniqlik
Kengaytirishsiz | 15 | 0.4316 | 85.34%
Kengaytirishsiz | 30 | 0.5018 | 85.26%
Kengaytirishsiz | 60 | 0.6603 | 86.02%
Kengaytirish bilan | 15 | 0.5123 | 81.61%
Kengaytirish bilan | 30 | 0.4740 | 82.62%
Kengaytirish bilan | 60 | 0.4118 | 85.72%
Bu jadvalni diqqat bilan o'qish kerak, chunki u kutilgan javobni bermaydi.
15-davrda kengaytirish yomonroq: 81.61% va 85.34%. Sabab tushunarli - model har safar boshqa rasm ko'radi, shuning uchun sekinroq o'rganadi.
60-davrda aniqlik deyarli tenglashdi: 85.72% va 86.02%.
Eng muhimi esa yo'qotish ustunida:
| Davr | Kengaytirishsiz | Kengaytirish bilan |
|---|---|---|
| 15 | 0.4316 | 0.5123 |
| 30 | 0.5018 (o'smoqda) | 0.4740 (tushmoqda) |
| 60 | 0.6603 (o'smoqda) | 0.4118 (tushgan) |
Kengaytirishsiz model ortiqcha moslashmoqda: yo'qotish 0.43 dan 0.66 ga o'sdi. Kengaytirish bilan esa u 0.51 dan 0.41 ga tushdi.
- Ma'lumot kam bo'lganda (bizdagidek 3000 ta).
- Uzoq o'qitganda - qisqa o'qishda u faqat sekinlashtiradi.
- Model ortiqcha moslashayotganda.
Ma'lumot ko'p bo'lsa (60 000 ta to'liq Fashion-MNIST), foydasi ancha kamayadi - model allaqachon yetarlicha xilma-xillik ko'ryapti.
Validatsiya va testda hech qanday tasodifiylik bo'lmasligi kerak:
o_ds = datasets.FashionMNIST(..., train=True, transform=kengaytirilgan)
t_ds = datasets.FashionMNIST(..., train=False, transform=oddiy)
Aks holda natijangiz har safar boshqacha chiqadi va ikki modelni solishtirib bo'lmaydi.
- Fashion-MNIST o'rtachasi va standart og'ishini hisoblang.
Normalizedan oldin va keyin qiymat oralig'ini solishtiring.- O'rtachani test to'plamidan hisoblash nega xato ekanini tushuntiring.
RandomHorizontalFlipvaRandomAffinebilanComposetuzing.- Bitta rasmni uch marta o'qib, natijalar farq qilishini ko'rsating.
ToTensor()ni birinchi qo'yib, nima bo'lishini tekshiring.- 3000 namunada kengaytirishsiz 60 davr o'qiting va yo'qotishni yozing.
- Xuddi shuni kengaytirish bilan takrorlang.
- Ikki yo'qotish egri chizig'ini solishtirib, xulosa yozing.
- Raqamlar to'plamida gorizontal aks ettirish nega xato bo'lishini tushuntiring.
Xulosa #
- Normallash qiymatlarni 0 atrofiga keltiradi:
(x - o'rtacha) / og'ish. - O'rtacha va og'ish faqat o'quv to'plamidan hisoblanadi.
transforms.Composeo'zgarishlarni ketma-ket qo'llaydi.- Tartib muhim: avval tasodifiy o'zgarishlar, keyin
ToTensor(), oxiridaNormalize. - Kengaytirish mavjud rasmlardan cheksiz variant yasaydi.
- O'zgarish rasmning ma'nosini buzmasligi kerak - raqamlarni aks ettirib bo'lmaydi.
- Kengaytirish qisqa o'qishda natijani yomonlashtiradi: 15-davrda 81.61% va 85.34%.
- Uzoq o'qishda esa tenglashadi: 60-davrda 85.72% va 86.02%.
- Asosiy foyda aniqlikda emas, yo'qotishda: 0.6603 o'rniga 0.4118.
- Kengaytirish faqat o'quv to'plamiga qo'llanadi, validatsiya va testga emas.
Keyingi bo'limda tayyor o'qitilgan modeldan foydalanishni o'rganamiz.
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.