Gestiunea Datelor: Clasa Dataset & DataLoader cu Paginare în PyTorch & Deep Learning Practic

Pipeline-ul standard de alimentare cu date: crearea unui Dataset personalizat (__len__, __getitem__) și paralelizarea încărcării cu DataLoader (batch_size, shuffle, num_workers).

Sintaxă & invocare Python
from torch.utils.data import Dataset, DataLoader

class SetDateTexte(Dataset):
    def __init__(self, texte, etichete):
        self.texte = texte
        self.etichete = etichete

    def __len__(self):
        return len(self.texte)

    def __getitem__(self, idx):
        return torch.tensor(self.texte[idx]), torch.tensor(self.etichete[idx])

loader = DataLoader(SetDateTexte(X, y), batch_size=32, shuffle=True, num_workers=2)

Descriere & Utilizare

Antrenarea unei rețele neuronale nu poate încărca un set de date de 50 GB direct în memoria RAM a calculatorului. PyTorch separă curat stocarea datelor de alimentarea modelului prin două clase fundamentale:

Dataset este containerul care știe să furnizeze un singur exemplu la un index dat. Trebuie să implementezi doar două metode Python: __len__(self) (returnează numărul total de mostre) și __getitem__(self, idx) (încarcă și prelucrează exemplul de la poziția idx).

DataLoader preia instanța de Dataset și se ocupă de toată complexitatea de producție: împarte datele în loturi (batch_size), le amestecă aleator la fiecare epocă (shuffle=True) și folosește procese secundare în paralel (num_workers > 0) pentru a citi de pe disc în timp ce GPU-ul calculează, eliminând gâturile de sticlă.

Cum să o reții ușor

💡 Dataset este meniul unui restaurant care descrie fiecare fel de mâncare în parte, iar DataLoader este chelnerul care aduce la masă platouri complete cu câte 32 de porții simultan, pregătite din timp de echipa din bucătărie (num_workers).

Opțiuni și parametri tehnici

  • batch_size: numărul de exemple procesate simultan într-un pas de antrenare (ex: 16, 32, 64).
  • shuffle=True: amestecă ordinea datelor la începutul fiecărei epoci (obligatoriu pe setul de antrenare, dezactivat pe validare).
  • num_workers: câte sub-procese CPU citesc datele în paralel (recomandat: 2–4).
  • pin_memory=True: alocă memoria într-o zonă blocată non-paginabilă, permițând transferul ultra-rapid pe GPU prin non_blocking=True.
  • collate_fn: funcție personalizată pentru alinierea secvențelor de lungimi diferite (padding dinamic pe batch).

Exemple practice și cazuri de utilizare

  • Iterarea prin DataLoader în buclă: for batch_x, batch_y in loader: ...
  • Împărțirea automată train/test: torch.utils.data.random_split(dataset, [0.8, 0.2]).
  • Padding dinamic la nivel de lot: pasează collate_fn=DataCollatorWithPadding(...) din Hugging Face.

Sfaturi de configurare & capcane

Pe Windows sau în scripturi scurte de testare, lasă num_workers=0 pentru a evita erorile de multiprocessing; pe Linux/macOS în producție, setează num_workers=2 sau 4 pentru a nu ține GPU-ul în așteptare.

Comenzi și ghiduri înrudite