• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

PyTorch DataLoader veri yükleme sürecini nasıl düzenler?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni

Veri yükleme akışını kurma​


PyTorch’ta veri yükleme sürecini düzenlemek için veriyi Dataset içinde tanımlayın, DataLoader ile mini gruplara ayırın ve eğitim döngüsünde yalnızca bu grupları tüketin. En temel akış Dataset → DataLoader → model şeklindedir. Aşağıdaki örnek, örnek veriyi yükleyip her adımda girdi ve hedef tensörlerini yazdırır; böylece boyutları eğitim başlamadan doğrulayabilirsiniz.

Dataset ve DataLoader görevlerini ayırın​


Dataset, tek bir örneğin nasıl okunacağını ve dönüştürüleceğini belirler. DataLoader ise bu örnekleri batch_size değerine göre gruplar, gerekirse karıştırır ve num_workers>0 olduğunda alt süreçlerle hazırlar.

Dataset içinde dosya okuma, etiket bulma ve örneğe uygulanacak dönüşümler bulunabilir. Mini grup oluşturma, örnekleri karıştırma ve yükleme sırasını yönetme gibi işler DataLoader’a bırakılmalıdır.

En küçük çalışan akış​


Ön koşul olarak PyTorch’un kurulu olduğu bir Python ortamı ve bellekte tutulabilecek küçük bir örnek veri kümesi kullanın. Aşağıdaki kodda her girdinin iki özellik, her hedefin de bir sınıf numarası olduğu varsayımsaldır.

Python:
import torch
from torch.utils.data import TensorDataset, DataLoader

# Varsayımsal giriş ve hedef verileri
x = torch.tensor([
    [1.0, 2.0],
    [2.0, 1.0],
    [3.0, 4.0],
    [4.0, 3.0],
    [5.0, 6.0],
    [6.0, 5.0],
])
y = torch.tensor([0, 0, 1, 1, 1, 1])

dataset = TensorDataset(x, y)
loader = DataLoader(
    dataset,
    batch_size=2,
    shuffle=True,
    num_workers=0,
)

for inputs, targets in loader:
    print("Girdi boyutu:", inputs.shape)
    print("Hedef boyutu:", targets.shape)
    print("Girdiler:\n", inputs)
    print("Hedefler:", targets)
    break

Bu örnekte beklenen girdi boyutu torch.Size([2, 2]), hedef boyutu ise torch.Size([2]) olur. shuffle=True nedeniyle örneklerin sırası değişebilir; bu durum veri yüklemenin çalışmadığını değil, her dönem öncesinde yükleme sırasının karıştırıldığını gösterir.

Eğitim için adım adım düzenleme​


Eğitim koduna geçmeden önce tek bir grubun modelinizin beklediği boyutları taşıdığını doğrulayın. Özellikle görüntülerde kanal sırası, metinlerde doldurma uzunluğu ve etiket türü yanlışsa hata DataLoader’dan değil veri hazırlama aşamasından kaynaklanabilir.
  1. Veri kümesini oluşturun. Dosya yollarını, ham veriyi ve etiketleri Dataset içinde eşleştirin; __getitem__() tek bir örnek, __len__() ise toplam örnek sayısını döndürmelidir.
  2. Örnek dönüşümlerini uygulayın. Normalleştirme, yeniden boyutlandırma veya tensöre çevirme işlemlerini tek örneğin biçimini bozmayacak şekilde Dataset içinde yapın.
  3. DataLoader’ı ayarlayın. batch_size ile mini grup boyutunu, eğitim verisinde shuffle=True değerini ve başlangıçta güvenilir hata ayıklama için num_workers=0 değerini belirleyin.
  4. Bir grubu doğrudan kontrol edin. next(iter(loader)) ile bir grup alın ve girdi, hedef boyutlarını, veri türlerini ve hedef değer aralığını yazdırın.
  5. Modeli gruplarla çalıştırın. Her döngüde girdileri cihaza taşıyın, modeli çalıştırın, kaybı hesaplayın ve geriye yayılımı gerçekleştirin; tek tek örnek yerine inputs ve targets kullanın.
  6. Yükleme ayarlarını kademeli olarak artırın. Önce num_workers=0 ile ana süreçte doğru sonucu alın, sonra num_workers değerini artırarak yükleme süresini ölçün; hata oluşursa son çalışan değere dönün.
Örnek eğitim döngüsü şu şekildedir:

Python:
model = torch.nn.Linear(2, 2)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

for inputs, targets in loader:
    inputs = inputs.to(device)
    targets = targets.to(device)

    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    loss.backward()
    optimizer.step()

    print("Kayıp:", loss.item())
    break

Bu döngüde outputs iki sınıf için skorlar üretir ve targets sınıf kimliklerini taşır. Kayıp değerinin yazdırılması yalnızca döngünün çalıştığını gösterir; modelin iyi öğrendiğini kanıtlamaz. Öğrenme başarısını ayrıca doğrulama verisi ve uygun bir ölçütle değerlendirmelisiniz.

Performans ayarlarını seçme​


Doğru sonucu aldıktan sonra yükleme hızını ayarlayın. Her parametre farklı bir darboğazı etkiler; daha yüksek değer her zaman daha iyi sonuç vermez.
AyarNe yapar?Ne zaman değiştirilmeli?
batch_sizeBir adımda işlenen örnek sayısını belirler.Bellek yeterliyse artırılır; bellek taşması olursa azaltılır.
shuffleÖrneklerin dönem başındaki sırasını karıştırır.Eğitimde genellikle True, doğrulama ve testte genellikle False kullanılır.
num_workersVeri hazırlamak için kullanılan alt süreç sayısını belirler.CPU veri hazırlama süresi GPU’yu bekletiyorsa kademeli artırılır.
pin_memoryAna bellekten CUDA cihazına aktarımını bazı durumlarda hızlandırabilir.CUDA ile çalışırken denenir; CPU kullanımında gerekli değildir.
drop_lastSon eksik mini grubu yok sayar.Tüm grupların eşit boyutta olması zorunluysa kullanılır; aksi hâlde veri kaybına yol açabilir.
persistent_workersİşçi süreçlerini dönemler arasında açık tutar.İşçi sayısı sıfırdan büyükken, dönem başındaki yeniden başlatma maliyeti belirginsa değerlendirilir.
batch_size artırıldığında tek adımda daha çok veri işlenir, ancak CPU/GPU belleği de daha fazla kullanılır. Bellek taşması alırsanız önce bu değeri azaltın. num_workers yalnızca dosya okuma veya dönüşüm CPU’da darboğaz oluşturuyorsa faydalıdır; küçük veri kümelerinde ek süreç oluşturma maliyeti performansı düşürebilir.

Aşağıdaki bağımsız örnek, CUDA varsa GPU’ya, yoksa CPU’ya aktarımı gösterir. Windows’ta num_workers>0 için süreçleri başlatan kodu if __name__ == "__main__": korumasında çalıştırın; örneği bir .py dosyasına kaydedip çalıştırabilirsiniz:

Python:
import torch
from torch.utils.data import DataLoader, TensorDataset


def main():
    # Küçük örnek veri; gerçek kullanımda kendi Dataset nesnenizi verin.
    dataset = TensorDataset(torch.randn(6, 2), torch.tensor([0, 0, 1, 1, 1, 1]))
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    loader = DataLoader(
        dataset,
        batch_size=32,
        shuffle=True,
        num_workers=2,
        pin_memory=(device.type == "cuda"),
    )

    for inputs, targets in loader:
        inputs = inputs.to(device, non_blocking=True)
        targets = targets.to(device, non_blocking=True)
        print(inputs.shape, targets.shape, device)


if __name__ == "__main__":
    main()

Buradaki ayarlar kesin bir hız garantisi vermez. Gerçek sonuç veri boyutuna, depolama hızına, dönüşümlerin maliyetine, CPU’ya ve GPU’ya bağlıdır. Bu nedenle değişiklikleri aynı veri ve model üzerinde yükleme süresi, bellek kullanımı ve eğitim süresiyle karşılaştırın.

Yaygın sorunları ayırma​


RuntimeError: stack expects each tensor to be equal size benzeri bir hata alırsanız aynı mini gruptaki örneklerin boyutları farklı olabilir. Görüntülerde yeniden boyutlandırma, metinlerde doldurma veya özel bir collate_fn gerekebilir. Sorun num_workers=0 ile de sürüyorsa hata büyük olasılıkla veri örneğinin kendisindedir.

Bellek taşması çoğunlukla batch_size değerinin veya örnek boyutunun yüksek olduğunu gösterir; num_workers değerini azaltmak tek başına GPU belleğini çözmez. Buna karşılık RAM artışı ve işçi süreçleriyle ilgili sorunlarda num_workers değerini düşürün ve veri kümesinin her işçi sürecinde gereksiz büyük kopyalar oluşturmadığını kontrol edin.

Eğitim ve doğrulama verisini aynı DataLoader ayarlarıyla karıştırmayın. Eğitim yükleyicisinde karıştırma kullanılabilir; doğrulama ve testte örnek sırasının sabit tutulması, sonuçların dönemler arasında daha kolay karşılaştırılmasını sağlar. Test verisini eğitim sırasında modele veya dönüşüm istatistiklerine sızdırmadığınızdan da emin olun.
 
Son düzenleme:

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Geri
Üst