3-bo‘lim
Tenzor amallari va shakl
Arifmetika, matritsa ko'paytmasi, reshape va view farqi, o'lchov qo'shish hamda broadcasting qoidalari.
Ushbu bo‘lim mundarijasi
Neyron tarmoqdagi deyarli har bir xato - shakl xatosi. Shuning uchun tenzorning shakli bilan erkin ishlash frameworkni bilishning yarmi.
Arifmetika #
import torch
a = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
b = torch.tensor([[10.0, 20.0], [30.0, 40.0]])
print("a + b =\n", a + b)
print("a * b (elementma-element) =\n", a * b)
print("a @ b (matritsa ko'paytmasi) =\n", a @ b)
print("yig'indi:", a.sum().item(), "| o'rtacha:", a.mean().item(), "| eng katta:", a.max().item())
a + b =
tensor([[11., 22.],
[33., 44.]])
a * b (elementma-element) =
tensor([[ 10., 40.],
[ 90., 160.]])
a @ b (matritsa ko'paytmasi) =
tensor([[ 70., 100.],
[150., 220.]])
yig'indi: 10.0 | o'rtacha: 2.5 | eng katta: 4.0
* va @ - ikki boshqa amalBu eng ko'p uchraydigan chalkashlik:
| Amal | Nomi | Natija |
|---|---|---|
a * b | Elementma-element (Hadamard) | Har katak o'z juftiga ko'paytiriladi |
a @ b | Matritsa ko'paytmasi | Qator va ustun skalyar ko'paytmasi |
Yuqoridagi natijada farq aniq ko'rinadi: 1*10 = 10 va 1*10 + 2*30 = 70.
Neyron tarmoqdagi qatlam - bu matritsa ko'paytmasi, ya'ni @ yoki
torch.matmul.
.item() bitta elementli tenzordan oddiy Python sonini oladi. Usiz
print tenzor ko'rinishida chiqadi - jurnalga yozish uchun noqulay.
Shakl bilan ishlash #
x = torch.arange(12)
print("boshlangich:", x.shape)
print("reshape(3,4):", x.reshape(3, 4).shape)
print("reshape(2,-1):", x.reshape(2, -1).shape)
y = x.reshape(3, 4)
print("transpose:", y.T.shape)
print("unsqueeze(0):", y.unsqueeze(0).shape)
print("squeeze:", y.unsqueeze(0).squeeze().shape)
boshlangich: torch.Size([12])
reshape(3,4): torch.Size([3, 4])
reshape(2,-1): torch.Size([2, 6])
transpose: torch.Size([4, 3])
unsqueeze(0): torch.Size([1, 3, 4])
squeeze: torch.Size([3, 4])
| Metod | Nima qiladi |
|---|---|
reshape(3, 4) | Shaklni o'zgartiradi, elementlar soni saqlanadi |
reshape(2, -1) | -1 - «qolganini o'zing hisobla» |
.T yoki transpose(0, 1) | Ikki o'lchovni almashtiradi |
unsqueeze(0) | Boshiga 1 o'lchamli o'q qo'shadi |
squeeze() | 1 o'lchamli o'qlarni olib tashlaydi |
permute(2, 0, 1) | O'qlarni istalgan tartibda qayta joylaydi |
view va reshape farqiIkkalasi ham shaklni o'zgartiradi, lekin:
view | reshape | |
|---|---|---|
| Xotira | Faqat uzluksiz (contiguous) tenzorda ishlaydi | Kerak bo'lsa nusxa oladi |
| Tezlik | Biroz tezroq - nusxa yo'q | Ba'zan nusxa olinadi |
| Ishonchlilik | transpose dan keyin xato berishi mumkin | Deyarli har doim ishlaydi |
Ikkilanmasangiz reshape ni ishlating. view xato bersa, xabar
tushunarli bo'ladi: *"view size is not compatible with input tensor's
size and stride"* - unda .contiguous().view(...) yoki oddiygina
reshape yordam beradi.
Broadcasting #
Har xil shakldagi tenzorlarni qo'shganda PyTorch kichigini avtomatik "cho'zadi":
m = torch.ones(3, 4)
v = torch.tensor([1.0, 2.0, 3.0, 4.0])
print("(3,4) + (4,) =", (m + v).shape)
print(m + v)
(3,4) + (4,) = torch.Size([3, 4])
tensor([[2., 3., 4., 5.],
[2., 3., 4., 5.],
[2., 3., 4., 5.]])
Qoida oddiy: shakllar oxiridan boshlab solishtiriladi va har juft o'lcham yo teng, yo biri 1 bo'lishi kerak.
| A shakli | B shakli | Natija | Izoh |
|---|---|---|---|
(3, 4) | (4,) | (3, 4) | B har qatorga qo'shiladi |
(3, 1) | (1, 4) | (3, 4) | Ikkalasi ham cho'ziladi |
(2, 3, 4) | (4,) | (2, 3, 4) | Oxirgi o'lcham mos |
(3, 4) | (3,) | xato | 4 va 3 mos kelmaydi |
Oxirgi holatda xato shunday ko'rinadi:
RuntimeError: The size of tensor a (4) must match the size of tensor b (3)
at non-singleton dimension 1
Xato xabari chiqmasligi har doim ham yaxshi emas. Klassik holat:
model chiqishi (32, 1), nishonlar esa (32,).
Ularni ayirsangiz, broadcasting ishga tushadi va natija (32, 32)
bo'ladi - 32 emas, 1024 ta son! Yo'qotish funksiyasi hisoblanadi, model
o'qiydi, lekin butunlay noto'g'ri narsani o'rganadi.
Shuning uchun yo'qotishdan oldin shakllarni tekshiring:
assert chiqish.shape == nishon.shape, (chiqish.shape, nishon.shape)
Yoki .squeeze() bilan ortiqcha o'qni olib tashlang. Bu xato shu qadar
ko'p uchraydiki, PyTorch ba'zi hollarda ogohlantirish ham beradi.
Indekslash #
NumPy bilgan odam uchun yangilik yo'q:
| Yozuv | Nima qaytaradi |
|---|---|
x[0] | Birinchi qator |
x[:, 0] | Birinchi ustun |
x[1:3] | 1 va 2-qatorlar |
x[x > 5] | Shartga mos elementlar |
x[:, -1] | Oxirgi ustun |
Ko'p ishlatiladigan amallar #
| Amal | Nima qiladi |
|---|---|
torch.cat([a, b], dim=0) | Mavjud o'q bo'ylab ulaydi |
torch.stack([a, b]) | Yangi o'q qo'shib ulaydi |
x.sum(dim=1) | Ustunlar bo'ylab yig'indi |
x.mean(dim=0) | Qatorlar bo'ylab o'rtacha |
x.argmax(dim=1) | Eng katta elementning indeksi |
torch.no_grad() | Hosila kuzatuvini o'chiradi (4-bo'lim) |
argmax klassifikatsiyada doim kerak bo'ladi: model har sinf uchun ball
beradi, argmax esa eng yuqori ballli sinf raqamini qaytaradi.
- Ikkita 3x3 tenzor yaratib,
+,*va@natijalarini solishtiring. @natijasidagi birinchi katakni qo'lda hisoblab, tekshiring.- 24 elementli tenzor yasang va uni
(2, 3, 4)shaklga keltiring. - Uni
(4, 6)ga o'zgartiring --1dan foydalaning. permutebilan o'qlar tartibini o'zgartirib, shaklni chiqaring.unsqueezevasqueezeni ketma-ket qo'llab, shakl qaytishini ko'ring.(3, 4)va(4,)tenzorlarni qo'shing - broadcasting qanday ishladi?(3, 4)va(3,)ni qo'shishga urinib, xato xabarini yozib oling.(32, 1)va(32,)shakllarni ayiring va natija shaklini ko'ring - nega 1024 ta son chiqdi?argmax(dim=1)bilan har qatordagi eng katta element indeksini toping.
Xulosa #
*- elementma-element,@- matritsa ko'paytmasi; neyron qatlami@dan iborat..item()bitta elementli tenzordan oddiy Python sonini oladi.reshape(-1)- «qolgan o'lchamni o'zing hisobla» degani.unsqueezeo'q qo'shadi,squeezebitta elementli o'qlarni olib tashlaydi.viewfaqat uzluksiz tenzorda ishlaydi; ikkilansangizreshapeni oling.- Broadcasting shakllarni oxiridan solishtiradi: o'lchamlar teng yoki biri 1 bo'lishi kerak.
- Broadcasting jim xato qilishi mumkin:
(32, 1)va(32,)ayirmasi(32, 32)beradi. - Shuning uchun yo'qotishdan oldin shakllarni
assertbilan tekshiring. - Xato qidirganda har qadamdan keyin
print(x.shape)yozish eng tez yo'l. argmax(dim=1)klassifikatsiyada model tanlagan sinfni beradi.
Keyingi bo'limda PyTorch ning eng muhim imkoniyati - avtomatik differensiallash bilan tanishamiz.
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.