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@sautorch.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=Trueevită 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”.
Întrebări & Exemple practice:
Operații cu tensori: indexare, broadcasting, matmul și reduceriAi 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.