Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

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).

(8, 1, 6, 1) + (7, 1, 5) → (8, 7, 6, 5)

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

Python: tensör oluşturma, şekil, yayınlama ve cihaz
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

  1. (5, 1, 4) ve (3, 1) şekilli iki tensör toplanırsa sonuç ne olur?

  2. (32, 100) @ (100, 10) işleminin sonucu hangi şekildedir?

  3. x.T.view(-1) neden hata verebilir?

  4. Tahmin (64,), hedef (64, 1) şeklindeyse (pred − target) ** 2 hangi şekilde çıkar?

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ç