5-bo‘lim
nn.Module bilan birinchi model
Linear qatlam, nn.Module dan meros olish, forward() metodi, parametrlarni sanash va Sequential bilan qisqa yozuv.
Ushbu bo‘lim mundarijasi
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.
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)
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.
| Yozuv | Ma'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 |
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.
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)
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 unutmangAgar 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 #
Parametrlarni sanash #
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")
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:
chiqish = model(torch.randn(5, 3))
print("5 ta namuna uchun chiqish shakli:", chiqish.shape)
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:
ketma = nn.Sequential(
nn.Linear(3, 8),
nn.ReLU(),
nn.Linear(8, 1),
)
print("Sequential parametrlari:", sum(p.numel() for p in ketma.parameters()))
Sequential parametrlari: 41
Bir xil model, ikki xil yozuv.
| Qachon | Nimani tanlash |
|---|---|
| Qatlamlar to'g'ri ketma-ket | nn.Sequential - qisqa va o'qishli |
| Shoxlanish, qayta ishlatish, shart | O'z sinfingiz - forward da erkinlik bor |
| Oraliq natija kerak | O'z sinfingiz - uni qaytarib olasiz |
Boshlanishda nn.Sequential bilan tez sinab ko'ring. Model murakkablashib,
forward ichida shart yoki shoxlanish kerak bo'lgandayoq sinfga o'ting.
nn.Linear(5, 3)yarating vaweighthamdabiasshakllarini chop eting.- Unga
(10, 5)shaklidagi tenzor bering va chiqish shaklini tekshiring. (10, 4)shaklidagi tenzor berib, xato xabarini o'qing.- Uch qatlamli
nn.Modulesinfini yozing. super().__init__()ni o'chirib,model.parameters()bo'shligini ko'ring, keyin qaytaring.print(model)chiqishini o'rganing.named_parameters()bilan har bir parametrni sanab chiqing.- Jami parametrlar sonini qo'lda hisoblab, dastur natijasi bilan solishtiring.
- Xuddi shu modelni
nn.Sequentialbilan yozing va parametrlar sonini taqqoslang. - Yashirin qatlamni 8 dan 64 ga oshiring va parametrlar necha marta ko'payganini yozing.
Xulosa #
- PyTorch da har qanday model
nn.Moduledan meros oladi. nn.Linear(kirish, chiqish)faqat oxirgi o'lchamni o'zgartiradi.- Model ikki qismdan iborat:
__init__da qatlamlar,forwardda 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.
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.