Okullar için Robotik ve Mühendislik · anaokulundan liseye

6. ünite / 10

Dataset ve DataLoader: veriyi yığınlar hâlinde beslemek

Dataset arayüzü (__len__, __getitem__), DataLoader, batch_size, shuffle, drop_last, random_split, dönüşümler, num_workers.

Bu ünitenin sonunda

  • Kendi verin için bir Dataset sınıfı yazmak
  • batch_size, shuffle ve drop_last'in tur başına adım sayısına etkisini hesaplamak
  • Eğitimde karıştırmanın, doğrulamada karıştırmamanın nedenini açıklamak
  • Tekrarlanabilir veri ayrımı ve karıştırma için Generator tohumu kullanmak

Ders notları

Model veriyi tek tek değil yığınlar (mini-batch) hâlinde görür: gradyan birkaç örneğin ortalamasıdır, GPU paralel çalışır. PyTorch bu işi iki parçaya ayırır.

Dataset

Bir Dataset iki şey bilir: kaç örnek var (__len__) ve i. örnek nedir (__getitem__). Dosya okuma, ön işleme ve veri artırma (transforms) burada, örnek başına yapılır. Hazır kümeler (torchvision.datasets.MNIST gibi) de aynı arayüzü uygular.

DataLoader

DataLoader örnekleri yığınlara toplar (collate), isteğe bağlı karıştırır ve paralel işçilerle (num_workers) yükler.

adım/tur = ⌈N / B⌉   (drop_last=True ise ⌊N / B⌋)

shuffle=True eğitimde her tur sırayı değiştirir; aynı sırayla gelen yığınlar gradyanlara bir örüntü katar. Doğrulamada sıra sonucu değiştirmez, karıştırmaya gerek yoktur. drop_last, BatchNorm gibi yığın istatistiği kullanan katmanlarda tek örnekli son yığının sorun çıkarmasını önler.

Tekrarlanabilirlik

random_split ve DataLoader'a generator=torch.Generator().manual_seed(42) ver: aynı tohum aynı ayrımı ve aynı sırayı verir. Bu, iki deneyi adil karşılaştırmanın ön şartıdır.

Görselleştirici

DataLoader: karıştırma, yığın ve tur

Veri kümesi 0..N−1 numaralı hücreler. batch_size, shuffle, drop_last ve tohumu (seed) değiştir; her turda hangi örneğin hangi yığına düştüğünü, tur başına adım sayısını ve son yığının boyunu gör.

Kendin dene

DataLoader görselleştiricisinde N = 50, batch_size = 8 yap: kaç adım var, son yığın kaç örnekli? drop_last'ı aç: hangi örnekler bu turda hiç görülmedi? shuffle'ı açıp turu 1, 2, 3 yap: her turda sıra değişiyor mu? Tohumu aynı bırakıp sayfayı yenile: sıra aynı mı kaldı?

Kod

Python: Dataset ve DataLoader
import torch
from torch.utils.data import Dataset, DataLoader, random_split

class SensorVerisi(Dataset):                             # kendi veri kümen: __len__ ve __getitem__
    def __init__(self, n=1000):
        g = torch.Generator().manual_seed(0)
        self.X = torch.randn(n, 3, generator=g)
        self.y = (self.X.sum(1) > 0).long()
    def __len__(self):
        return len(self.X)
    def __getitem__(self, i):
        return self.X[i], self.y[i]                      # tek örnek; yığını DataLoader kurar

ds = SensorVerisi()
tr, va = random_split(ds, [800, 200], generator=torch.Generator().manual_seed(42))
tr_dl = DataLoader(tr, batch_size=64, shuffle=True, drop_last=True)    # eğitimde karıştır
va_dl = DataLoader(va, batch_size=256, shuffle=False)                 # doğrulamada karıştırma gerekmez
print(len(tr_dl), 'adım/tur')                       # 800 // 64 = 12
xb, yb = next(iter(tr_dl))
print(xb.shape, yb.shape)                                # torch.Size([64, 3]) torch.Size([64])

Colab defteri

PyTorch tarayıcıda çalışmaz; gerçek kodu Google Colab'da (ücretsiz GPU ile) çalıştır. Defteri indir, colab.research.google.com adresinde "Dosya → Not defteri yükle" ile aç, "Çalışma zamanı → Çalışma zamanı türünü değiştir → T4 GPU" seç ve hücreleri sırayla çalıştır.

Defteri indir (.ipynb)

Sık yapılan hatalar

  • Doğrulama DataLoader'ında shuffle=True: zararsız ama gereksiz; asıl hata eğitimde shuffle=False bırakıp sıralı (ör. sınıfa göre dizilmiş) veriyle eğitmek.
  • __getitem__ içinde her seferinde tüm dosyayı okumak: eğitim yavaşlar. Bir kez yükle ya da önbellekle.
  • Windows/macOS'ta num_workers > 0 ile if __name__ == "__main__" koruması olmadan çalıştırmak: süreçler sonsuz başlar.
  • Veri artırmayı doğrulama kümesine de uygulamak: ölçüm gürültülenir. Doğrulamada yalnız normalleştirme.

Yazılım mühendisliği bağlantısı

Dataset, veri katmanını model kodundan ayıran bir arayüzdür (adaptör deseni). Model, verinin diskte mi, veritabanında mı, sensörden mi geldiğini bilmez.

  • Dataset için birim testi: uzunluk, bir örneğin şekli ve tipi, etiket aralığı.
  • Veri sürümünü (dosya özeti, tarih) deney kaydına ekle; "aynı kod, farklı veri" hatalarını yakalar.

Kendini sına

  1. N = 1000, batch_size = 64, drop_last = False. Bir turda kaç adım vardır?

  2. Aynı ayarla drop_last = True yapılırsa?

  3. Bir Dataset sınıfının mutlaka uygulaması gereken iki yöntem hangileridir?

  4. Eğitimde shuffle=True neden önemlidir?

Bu üniteden sonra bitirme projesinde

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç