5-bo‘lim

nn.Module bilan birinchi model

Linear qatlam, nn.Module dan meros olish, forward() metodi, parametrlarni sanash va Sequential bilan qisqa yozuv.

🕑 8 daqiqa o‘qish 📄 567 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Eng kichik qatlam: nn.Linear
  2. O'z modelingizni yozish
  3. Ma'lumot qanday oqadi
  4. Parametrlarni sanash
  5. Paket bilan ishlash
  6. nn.Sequential - qisqa yozuv
  7. Xulosa

Tenzor va autograd - qurilish g'ishtlari. Endi ulardan model yasaymiz. PyTorch da har qanday model nn.Module dan meros oladi.

Eng kichik qatlam: nn.Linear #

nn.Linear bitta chiziqli amalni bajaradi: y = x @ W.T + b.

Python
import torch
import torch.nn as nn

torch.manual_seed(42)

qatlam = nn.Linear(3, 2)
print("og'irlik shakli:", qatlam.weight.shape)
print("siljish shakli: ", qatlam.bias.shape)

x = torch.randn(4, 3)
y = qatlam(x)
print("kirish:", x.shape, "-> chiqish:", y.shape)
Natija
og'irlik shakli: torch.Size([2, 3])
siljish shakli:  torch.Size([2])
kirish: torch.Size([4, 3]) -> chiqish: torch.Size([4, 2])

Diqqat qiling: kirishda 4 ta namuna bor edi, chiqishda ham 4 ta. Qatlam faqat oxirgi o'lchamni 3 dan 2 ga o'zgartirdi.

YozuvMa'nosi
nn.Linear(3, 2)3 ta belgini qabul qiladi, 2 ta qiymat qaytaradi
weight(2, 3) shaklidagi og'irliklar - o'qitiladi
bias(2,) shaklidagi siljish - o'qitiladi
qatlam(x)forward() ni chaqiradi
Nega qatlam(x), qatlam.forward(x) emas?

Ikkalasi ham hisoblaydi, lekin qatlam(x) yozuvi qo'shimcha ishlarni ham bajaradi (hooks, rejim tekshiruvi). Shuning uchun doim model(x) yozing, model.forward(x) emas.

O'z modelingizni yozish #

Haqiqiy model bir nechta qatlamdan iborat bo'ladi. Uni yozish uchun nn.Module dan meros olinadi va ikkita narsa yoziladi: __init__ da qatlamlar, forward da ularning tartibi.

Python
class KichikTarmoq(nn.Module):
    def __init__(self, kirish, yashirin, chiqish):
        super().__init__()
        self.qatlam1 = nn.Linear(kirish, yashirin)
        self.faol = nn.ReLU()
        self.qatlam2 = nn.Linear(yashirin, chiqish)

    def forward(self, x):
        x = self.qatlam1(x)
        x = self.faol(x)
        return self.qatlam2(x)

model = KichikTarmoq(3, 8, 1)
print(model)
Natija
KichikTarmoq(
  (qatlam1): Linear(in_features=3, out_features=8, bias=True)
  (faol): ReLU()
  (qatlam2): Linear(in_features=8, out_features=1, bias=True)
)

print(model) modelning tuzilishini ko'rsatadi - bu xatolarni topishda juda qulay.

super().__init__() ni unutmang

Agar uni yozmasangiz, PyTorch parametrlarni ro'yxatga olmaydi. Natijada model.parameters() bo'sh qaytadi va optimizator hech nimani o'qitmaydi. Xato chiqmaydi - model shunchaki o'rganmaydi.

Ma'lumot qanday oqadi #

KichikTarmoq(3, 8, 1) ichida bitta namuna kirish (1, 3) qatlam1 Linear(3, 8) ReLU (1, 8) qatlam2 Linear(8, 1) chiqish (1, 1) 24 + 8 = 32 parametr 0 parametr 8 + 1 = 9 parametr jami 41 ta o'qitiladigan parametr
forward() shu yo'lni ketma-ket bosib o'tadi; ReLU da parametr yo'q

Parametrlarni sanash #

Python
jami = sum(p.numel() for p in model.parameters())
print("parametrlar soni:", jami)

for nom, p in model.named_parameters():
    print(f"  {nom:16s} {tuple(p.shape)}  {p.numel()} ta")
Natija
parametrlar soni: 41
  qatlam1.weight   (8, 3)  24 ta
  qatlam1.bias     (8,)  8 ta
  qatlam2.weight   (1, 8)  8 ta
  qatlam2.bias     (1,)  1 ta

24 + 8 + 8 + 1 = 41 - figuradagi son bilan mos tushdi. Bu odat foydali: model kutilganidan ancha katta yoki kichik bo'lsa, xato shu yerda ko'rinadi.

Paket bilan ishlash #

Model bitta namuna uchun emas, paket uchun yoziladi:

Python
chiqish = model(torch.randn(5, 3))
print("5 ta namuna uchun chiqish shakli:", chiqish.shape)
Natija
5 ta namuna uchun chiqish shakli: torch.Size([5, 1])

Birinchi o'lcham har doim paket hajmi bo'ladi. Siz forward da u haqida o'ylamaysiz ham - qatlamlar uni o'zi tashib yuradi.

nn.Sequential - qisqa yozuv #

Agar qatlamlar shunchaki ketma-ket bo'lsa, sinf yozish shart emas:

Python
ketma = nn.Sequential(
    nn.Linear(3, 8),
    nn.ReLU(),
    nn.Linear(8, 1),
)
print("Sequential parametrlari:", sum(p.numel() for p in ketma.parameters()))
Natija
Sequential parametrlari: 41

Bir xil model, ikki xil yozuv.

QachonNimani tanlash
Qatlamlar to'g'ri ketma-ketnn.Sequential - qisqa va o'qishli
Shoxlanish, qayta ishlatish, shartO'z sinfingiz - forward da erkinlik bor
Oraliq natija kerakO'z sinfingiz - uni qaytarib olasiz
Avval Sequential, keyin sinf

Boshlanishda nn.Sequential bilan tez sinab ko'ring. Model murakkablashib, forward ichida shart yoki shoxlanish kerak bo'lgandayoq sinfga o'ting.

Amaliy topshiriq
  1. nn.Linear(5, 3) yarating va weight hamda bias shakllarini chop eting.
  2. Unga (10, 5) shaklidagi tenzor bering va chiqish shaklini tekshiring.
  3. (10, 4) shaklidagi tenzor berib, xato xabarini o'qing.
  4. Uch qatlamli nn.Module sinfini yozing.
  5. super().__init__() ni o'chirib, model.parameters() bo'shligini ko'ring, keyin qaytaring.
  6. print(model) chiqishini o'rganing.
  7. named_parameters() bilan har bir parametrni sanab chiqing.
  8. Jami parametrlar sonini qo'lda hisoblab, dastur natijasi bilan solishtiring.
  9. Xuddi shu modelni nn.Sequential bilan yozing va parametrlar sonini taqqoslang.
  10. Yashirin qatlamni 8 dan 64 ga oshiring va parametrlar necha marta ko'payganini yozing.

Xulosa #

  • PyTorch da har qanday model nn.Module dan meros oladi.
  • nn.Linear(kirish, chiqish) faqat oxirgi o'lchamni o'zgartiradi.
  • Model ikki qismdan iborat: __init__ da qatlamlar, forward da ularning tartibi.
  • super().__init__() majburiy - usiz parametrlar ro'yxatga olinmaydi va model o'qimaydi.
  • Modelni model(x) deb chaqiring, model.forward(x) deb emas.
  • print(model) tuzilishni ko'rsatadi - xato qidirishda birinchi qadam.
  • model.parameters() barcha o'qitiladigan tenzorlarni beradi.
  • named_parameters() ularni nomi bilan beradi - qaysi qatlam qancha joy olishi ko'rinadi.
  • Model paket bilan ishlaydi: birinchi o'lcham har doim namunalar soni.
  • nn.Sequential - qatlamlar ketma-ket bo'lganda qisqa muqobil.

Keyingi bo'limda modelga nima o'rganishni aytadigan ikki narsani qo'shamiz: yo'qotish funksiyasi va optimizator.

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.