3-bo‘lim

Tenzor amallari va shakl

Arifmetika, matritsa ko'paytmasi, reshape va view farqi, o'lchov qo'shish hamda broadcasting qoidalari.

🕑 9 daqiqa o‘qish 📄 821 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Arifmetika
  2. Shakl bilan ishlash
  3. Broadcasting
  4. Indekslash
  5. Ko'p ishlatiladigan amallar
  6. Xulosa

Neyron tarmoqdagi deyarli har bir xato - shakl xatosi. Shuning uchun tenzorning shakli bilan erkin ishlash frameworkni bilishning yarmi.

Arifmetika #

Python
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())
Natija
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 amal

Bu eng ko'p uchraydigan chalkashlik:

AmalNomiNatija
a * bElementma-element (Hadamard)Har katak o'z juftiga ko'paytiriladi
a @ bMatritsa ko'paytmasiQator 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 #

Python
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)
Natija
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])
MetodNima 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
Bir xil 12 ta son - uch xil shakl shape: (12,) 0 1 2 3 4 5 6 7 8 9 10 11 reshape shape: (3, 4) 0 1 2 3 / 4 5 6 7 8 9 10 11 .T shape: (4, 3) 0 4 8 / 1 5 9 2 6 10 / 3 7 11 Xatoni qanday topish kerak Modelda xato chiqsa - har qadamdan keyin print(x.shape) yozing. Xatolarning katta qismi shu yerda ko'rinadi: kutilgan shakl bilan haqiqiysi mos kelmaydi.
Shakl bilan ishlash - PyTorch da eng ko'p ishlatiladigan ko'nikma
view va reshape farqi

Ikkalasi ham shaklni o'zgartiradi, lekin:

viewreshape
XotiraFaqat uzluksiz (contiguous) tenzorda ishlaydiKerak bo'lsa nusxa oladi
TezlikBiroz tezroq - nusxa yo'qBa'zan nusxa olinadi
Ishonchliliktranspose dan keyin xato berishi mumkinDeyarli 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":

Python
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)
Natija
(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 shakliB shakliNatijaIzoh
(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,)xato4 va 3 mos kelmaydi

Oxirgi holatda xato shunday ko'rinadi:

Natija
RuntimeError: The size of tensor a (4) must match the size of tensor b (3)
at non-singleton dimension 1
Broadcasting jim xato ham qilishi mumkin

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:

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

YozuvNima 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 #

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

Amaliy topshiriq
  1. Ikkita 3x3 tenzor yaratib, +, * va @ natijalarini solishtiring.
  2. @ natijasidagi birinchi katakni qo'lda hisoblab, tekshiring.
  3. 24 elementli tenzor yasang va uni (2, 3, 4) shaklga keltiring.
  4. Uni (4, 6) ga o'zgartiring - -1 dan foydalaning.
  5. permute bilan o'qlar tartibini o'zgartirib, shaklni chiqaring.
  6. unsqueeze va squeeze ni ketma-ket qo'llab, shakl qaytishini ko'ring.
  7. (3, 4) va (4,) tenzorlarni qo'shing - broadcasting qanday ishladi?
  8. (3, 4) va (3,) ni qo'shishga urinib, xato xabarini yozib oling.
  9. (32, 1) va (32,) shakllarni ayiring va natija shaklini ko'ring - nega 1024 ta son chiqdi?
  10. 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.
  • unsqueeze o'q qo'shadi, squeeze bitta elementli o'qlarni olib tashlaydi.
  • view faqat uzluksiz tenzorda ishlaydi; ikkilansangiz reshape ni 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 assert bilan 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.

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.