15-bo‘lim

Normallash va ma'lumotni kengaytirish

transforms.Compose, Normalize, RandomHorizontalFlip va RandomAffine, kengaytirishning haqiqiy ta'siri o'lchanadi.

🕑 8 daqiqa o‘qish 📄 697 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Normallash
  2. Kengaytirish (augmentation)
  3. Qaysi o'zgarishni tanlash
  4. Haqiqiy ta'sirini o'lchaymiz
  5. Xulosa

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:

Python
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}")
Natija
to'plam o'rtachasi: 0.2860  standart og'ish: 0.3530

Endi Normalize qo'llaymiz:

Python
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}")
Natija
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.

Nega bu yordam beradi

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:

Python
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:

Natija
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.

Tartib muhim

RandomHorizontalFlip va RandomAffine PIL rasm bilan ishlaydi, Normalize esa tenzor bilan. Shuning uchun tartib har doim shunday:

  1. Tasodifiy o'zgarishlar (flip, affine, crop)
  2. ToTensor()
  3. Normalize(...)

ToTensor() dan keyin RandomHorizontalFlip qo'ysangiz, xato chiqadi yoki o'zgarish qo'llanmay qoladi.

Qaysi o'zgarishni tanlash #

O'zgarishNima qiladiEhtiyot
RandomHorizontalFlipChap-o'ngga aks ettiradiMatn va raqamlarda ishlatmang
RandomVerticalFlipYuqori-pastga ag'daradiKiyim va yuzlarda mantiqsiz
RandomAffineBuradi, siljitadi, cho'zadiBurchakni kichik tuting (5-15 daraja)
RandomCropQismini kesib oladipadding bilan birga ishlatiladi
ColorJitterYorqinlik va kontrastni o'zgartiradiKulrang rasmda ta'siri kam
Kengaytirish ma'noni buzmasligi kerak

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:

Natija
--- 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:

DavrKengaytirishsizKengaytirish bilan
150.43160.5123
300.5018 (o'smoqda)0.4740 (tushmoqda)
600.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.

Test yo'qotishi: 3000 namuna, bir xil model 0.70 0.60 0.50 0.40 15-davr 30-davr 60-davr 0.4316 0.5018 0.6603 0.5123 0.4740 0.4118 kengaytirishsiz - yo'qotish o'smoqda (ortiqcha moslashish) kengaytirish bilan - yo'qotish tushishda davom etmoqda
Aniqlik deyarli teng, lekin yo'qotish egri chiziqlari qarama-qarshi yo'nalishda
Kengaytirishdan qachon foyda kutish kerak
  • 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.

Kengaytirishni faqat o'quv to'plamiga qo'llang

Validatsiya va testda hech qanday tasodifiylik bo'lmasligi kerak:

Python
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.

Amaliy topshiriq
  1. Fashion-MNIST o'rtachasi va standart og'ishini hisoblang.
  2. Normalize dan oldin va keyin qiymat oralig'ini solishtiring.
  3. O'rtachani test to'plamidan hisoblash nega xato ekanini tushuntiring.
  4. RandomHorizontalFlip va RandomAffine bilan Compose tuzing.
  5. Bitta rasmni uch marta o'qib, natijalar farq qilishini ko'rsating.
  6. ToTensor() ni birinchi qo'yib, nima bo'lishini tekshiring.
  7. 3000 namunada kengaytirishsiz 60 davr o'qiting va yo'qotishni yozing.
  8. Xuddi shuni kengaytirish bilan takrorlang.
  9. Ikki yo'qotish egri chizig'ini solishtirib, xulosa yozing.
  10. 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.Compose o'zgarishlarni ketma-ket qo'llaydi.
  • Tartib muhim: avval tasodifiy o'zgarishlar, keyin ToTensor(), oxirida Normalize.
  • 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.

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.