Operații cu tensori: indexare, broadcasting, matmul și reduceri în PyTorch & Deep Learning Practic

Operațiile de bază pe tensori: indexare și slicing ca în NumPy, broadcasting între forme diferite, înmulțire de matrice cu @ / torch.matmul, reduceri pe axe și operații in-place cu sufixul _.

Sintaxă & invocare Python
import torch

a = torch.randn(32, 128, 64)
b = torch.randn(64, 10)
c = a @ b                           # torch.matmul -> [32, 128, 10]
m = c.mean(dim=-1, keepdim=True)    # reducere pe ultima axă -> [32, 128, 1]
d = c - m                           # broadcasting -> [32, 128, 10]
primul = c[:, 0, :]                 # indexare -> [32, 10]

Tutorialul oficial spune că API-ul tensorilor urmează NumPy: indexarea și slicing-ul (t[0], t[:, 0], t[..., -1], măști booleene) au aceeași sintaxă. Operatorii aritmetici lucrează element cu element: * este produsul element cu element (torch.mul), iar @ este înmulțirea de matrice (torch.matmul). torch.cat lipește tensori pe o axă existentă, torch.stack pe o axă nouă.

Broadcasting permite operații între tensori de forme diferite fără copierea datelor. Documentația dă regula: se compară dimensiunile de la ultima spre prima, iar pe fiecare axă mărimile trebuie să fie egale, una să fie 1 sau una să lipsească. Tensorul cu mai puține dimensiuni primește 1 în față, iar rezultatul are pe fiecare axă maximul celor două mărimi. Dacă regula nu se respectă, operația aruncă RuntimeError.

torch.matmul se comportă după numărul de dimensiuni: doi vectori dau produsul scalar, două matrice dau produsul matriceal, iar de la 3 dimensiuni în sus rezultă o înmulțire pe loturi (batched), cu broadcasting pe dimensiunile de lot. Reducerile (sum, mean, max, argmax) primesc dim și keepdim. Operațiile cu sufixul _ (add_, mul_, copy_) modifică tensorul pe loc; tutorialul le descurajează, pentru că pot strica istoricul necesar la calculul derivatelor.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
t[i], t[:, j], t[..., -1], t[masca] Indexare și slicing ca în NumPy; o mască booleană întoarce elementele selectate ca tensor 1D.
a * b / torch.mul Produs element cu element (cu broadcasting).
a @ b / torch.matmul Produs scalar, matriceal sau pe loturi, după numărul de dimensiuni.
torch.cat(tensori, dim) / torch.stack(tensori, dim) cat lipește pe o axă existentă; stack adaugă o axă nouă.
sum / mean / max / argmax (dim, keepdim) Reduceri pe o axă; keepdim=True păstrează axa cu mărimea 1, util pentru broadcasting.
torch.where(cond, a, b) Alege element cu element din a sau b după condiție.
t.item() Transformă un tensor cu un singur element într-un număr Python.
add_, mul_, copy_ ... Variante in-place (sufixul _).

Exemple practice și scenarii reale

Exemplul 1: Broadcasting: o formă compatibilă și una incompatibilă

Formele sunt cele din documentația despre broadcasting.

import torch

x = torch.empty(5, 1, 4, 1)
y = torch.empty(3, 1, 1)
print((x + y).shape)        # torch.Size([5, 3, 4, 1])

x = torch.empty(5, 2, 4, 1)
# x + y  -> RuntimeError: a treia dimensiune de la coadă: 2 != 3

Exemplul 2: Normalizare pe rânduri cu keepdim

scoruri = torch.randn(8, 5)
medie = scoruri.mean(dim=1, keepdim=True)    # [8, 1]
std = scoruri.std(dim=1, keepdim=True)       # [8, 1]
normalizat = (scoruri - medie) / (std + 1e-6)
clasa = scoruri.argmax(dim=1)                # [8], indicele maximului pe rând

Exemplul 3: Înmulțire pe loturi și mască booleană

q = torch.randn(4, 10, 64)       # [lot, tokeni, dim]
k = torch.randn(4, 10, 64)
scor = q @ k.transpose(-2, -1)   # [4, 10, 10]

s = torch.tensor([[1., 2.], [3., 4.]])
print(s[s > 2])                  # tensor([3., 4.])
print(s.sum().item())            # 10.0

Greșeli frecvente și capcane

  • Să folosești * când vrei produs matriceal. * înmulțește element cu element; pentru matrice folosești @ sau torch.matmul.
  • Să te bazezi pe broadcasting fără să verifici formele. O axă de mărime 1 pusă greșit (de exemplu [8] în loc de [8, 1]) nu dă eroare, ci un rezultat de altă formă; keepdim=True evită cazul la reduceri.
  • Să modifici in-place un tensor de care autograd are nevoie la backward. Rezultă eroarea „one of the variables needed for gradient computation has been modified by an inplace operation”.

Noțiuni și module înrudite

Învață AI • Comunitate & Q&A

Întrebări & Exemple practice: Operații cu tensori: indexare, broadcasting, matmul și reduceri

Ai o întrebare despre Operații cu tensori: indexare, broadcasting, matmul și reduceri sau ai descoperit un truc, prompt sau fragment de cod util? Distribuie-l cu ceilalți membri ai comunității!

🤖

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau resurse pentru această pagină. Dacă ai testat un prompt sau ai un snippet util, adaugă-l mai jos pentru comunitate.

Comunitate AI Adaugă o întrebare sau distribuie un cod / prompt

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.