1. ünite / 10
Tensörler: şekil, veri tipi, yayınlama ve cihaz
torch.Tensor, shape ve dtype, dilimleme, yayınlama kuralı, matmul, view ve reshape, CPU ve GPU.
Bu ünitenin sonunda
- Bir tensörün şeklini, veri tipini ve cihazını okumak ve değiştirmek
- Yayınlama kuralını sağdan sola uygulayarak işlem sonucunun şeklini önceden söylemek
- matmul'un şekil şartını ve yığın boyutlarının nasıl yayınlandığını açıklamak
- view ile reshape arasındaki farkı (bitişik bellek) bilmek
Ders notları
PyTorch'taki her şey bir tensördür: çok boyutlu bir sayı dizisi. NumPy dizisine benzer, iki farkı vardır: GPU'da çalışabilir ve üstünde yapılan işlemler otomatik türev için kaydedilebilir (2. ünite).
Şekil, tip, cihaz
Bir görüntü yığını (N, C, H, W) şeklindedir: örnek sayısı, kanal, yükseklik, genişlik. Ağırlıklar çoğunlukla float32, sınıf etiketleri int64 (long) olur. Model ve veri aynı cihazda olmalıdır: .to(device).
Yayınlama
Farklı şekilli iki tensörle işlem yaparken PyTorch boyutları sağdan hizalar. Her çift ya eşit olmalı ya da biri 1 olmalı; 1 olan boyut kopyalanmış gibi davranır (bellek kopyalanmaz).
Yayınlama çok kullanışlıdır (her satırdan ortalamayı çıkarmak gibi) ama sessiz hatalara da yol açar: (64,) ile (64, 1) toplanınca (64, 64) çıkar.
matmul ve view
A @ B için A'nın son boyutu B'nin sondan ikinci boyutuna eşit olmalıdır; daha öndeki boyutlar yayınlanır. view veriyi kopyalamadan yeni bir şekille okur; bunun için bellek bitişik olmalıdır. Devrik (.T) gibi işlemlerden sonra reshape (gerekirse kopyalar) ya da .contiguous().view() gerekir.
Görselleştirici
Şekil oyun alanı: yayınlama, matmul, view
İki tensörün şeklini yaz. Yayınlama (broadcasting) kuralı sağdan sola boyutları eşler; matmul iç boyutların eşitliğini ister; view eleman sayısının korunmasını ve bitişik belleği. Hata varsa PyTorch'un vereceği iletinin özü gösterilir.
Kendin dene
Şekil oyun alanında (8, 1, 6, 1) + (7, 1, 5) dene ve sonucu önce kâğıtta bul. Sonra (64,) ile (64, 1) topla: neden (64, 64) çıktı? matmul'a geç: (64, 784) @ (784, 10) ve (64, 784) @ (128, 10) dene, hata iletisini oku. view kipinde (4, 3, 28, 28) → (4, -1) yap; "bitişik değil" kutusunu işaretleyip reshape ile farkı gör.
Kod
import torch
x = torch.arange(12, dtype=torch.float32).reshape(3, 4) # 3 satır, 4 sütun
print(x.shape, x.dtype, x.device) # torch.Size([3, 4]) torch.float32 cpu
b = torch.tensor([10., 20., 30., 40.]) # şekil (4,)
print((x + b).shape) # yayınlama: (3,4) + (4,) → (3,4)
col = x.mean(dim=1, keepdim=True) # (3,1): satır ortalamaları
print((x - col).shape) # (3,4) − (3,1) → (3,4)
W = torch.randn(4, 2)
print((x @ W).shape) # matmul: (3,4)@(4,2) → (3,2)
t = x.T # devrik: bitişik değil
print(t.is_contiguous(), t.reshape(-1).shape) # view hata verir, reshape kopyalar
device = 'cuda' if torch.cuda.is_available() else 'cpu'
x = x.to(device) # model ve veri aynı cihazda olmalı
print(x.device)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
- (N,) şekilli tahmini (N, 1) şekilli hedefle karşılaştırmak: yayınlama sessizce (N, N) üretir, kayıp yanlış ama hata yok.
- Model GPU'da, veri CPU'da: "Expected all tensors to be on the same device" hatası. Her yığını .to(device) ile taşı.
- Sınıf etiketini float vermek: CrossEntropyLoss long (int64) indeks ister.
- Devrik sonrası view kullanmak: bitişik olmayan bellekte hata verir; reshape kullan.
Yazılım mühendisliği bağlantısı
Şekil hataları, derin öğrenme kodunda en sık karşılaşılan hatadır. Bunlara karşı en ucuz savunma şekil sözleşmeleridir.
- Fonksiyonların başına
assert x.shape[1:] == (1, 28, 28)gibi kontroller koy; yorumda şekli yaz:# (N, C, H, W). - Her modele, rastgele bir girdiyle çıkış şeklini sınayan tek satırlık bir birim testi yaz.
Kendini sına
(5, 1, 4) ve (3, 1) şekilli iki tensör toplanırsa sonuç ne olur?
(32, 100) @ (100, 10) işleminin sonucu hangi şekildedir?
x.T.view(-1) neden hata verebilir?
Tahmin (64,), hedef (64, 1) şeklindeyse (pred − target) ** 2 hangi şekilde çıkar?
