CodeBlanks Logo Icon CodeBlanks

Veri hazırlama

Görüntü verisini tensor'a dönüştürürsün.

Proje: yatay ve dikey çizgiler

Bu projede küçük bir CNN'e 16×16 gri görüntülerde yatay ve dikey çizgileri ayırmayı öğreteceğiz. Veriyi kendimiz üretiyoruz: hafif gürültülü bir arka plan üzerine ortadan geçen kalın bir çizgi. Sınıf 0 yatay, sınıf 1 dikey çizgidir:

X = torch.rand(n, 1, 16, 16) * 0.3       # gürültülü arka plan
# sınıf 0: X[k, 0, 7:9, :] += 1  -> yatay bant
# sınıf 1: X[k, 0, :, 7:9] += 1  -> dikey bant

Sentetik veri, gerçek bir görüntü setine geçmeden önce kodun ve şekillerin doğru olduğunu hızlıca sınamanın iyi bir yoludur.

Veriyi denetlemek

Eğitimden önce veri denetlenir: şekil, sınıf dengesi ve bir örneğin gerçekten beklenen deseni taşıyıp taşımadığı. Yatay çizgide orta satırların ortalaması, dikeyde orta sütunlarınki yüksektir:

print(X_train.shape, torch.bincount(y_train).tolist())
k = (y_train == 0).nonzero()[0].item()           # ilk yatay örnek
print(X_train[k, 0, 7:9].mean().item() > X_train[k, 0, :, 7:9].mean().item())

Sınıflar yaklaşık dengeli olduğu için doğruluk burada anlamlı bir metriktir.

Uygulama Veriyi incele

Eğitim verisinin şeklini yazdır. İlk yatay örnek için orta satırların ortalamasının orta sütunlarınkinden büyük olduğunu, ilk dikey örnek için tersini aynı satırda yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

torch.manual_seed(0)
def veri(n):
    X = torch.rand(n, 1, 16, 16) * 0.3
    y = torch.randint(0, 2, (n,))
    for k in range(n):
        if y[k] == 0:
            X[k, 0, 7:9, :] += 1.0
        else:
            X[k, 0, :, 7:9] += 1.0
    return X, y

X_train, y_train = veri(256)
X_test, y_test = veri(64)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

torch.manual_seed(0)
def veri(n):
    X = torch.rand(n, 1, 16, 16) * 0.3
    y = torch.randint(0, 2, (n,))
    for k in range(n):
        if y[k] == 0:
            X[k, 0, 7:9, :] += 1.0
        else:
            X[k, 0, :, 7:9] += 1.0
    return X, y

X_train, y_train = veri(256)
X_test, y_test = veri(64)

print(X_train.shape)
k0 = (y_train == 0).nonzero()[0].item()
k1 = (y_train == 1).nonzero()[0].item()
a = X_train[k0, 0, 7:9].mean() > X_train[k0, 0, :, 7:9].mean()
b = X_train[k1, 0, :, 7:9].mean() > X_train[k1, 0, 7:9].mean()
print(a.item(), b.item())

Beklenen çıktı

torch.Size([256, 1, 16, 16])
True True

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Görüntü tensörünün şekli neden (n, 1, 16, 16)'dır?

  • Rastgele seçilmiştir
  • Doğrusal katman için
  • RNN için
  • Conv2d (örnek, kanal, yükseklik, genişlik) ister; gri görüntü tek kanallıdır Doğru cevap

Açıklama: Renkli görüntüde kanal sayısı 3 olurdu.

2 Sınıf sayımlarını al.

Soru
print(torch.____(y_train).tolist())
Cevap
print(torch.bincount(y_train).tolist())

Açıklama: torch.bincount negatif olmayan tam sayıları sayar.

3 Veri parçalarını eşleştir.

Kavram Anlamı
torch.rand(...) * 0.3 Gürültülü arka plan
X[k, 0, 7:9, :] Yatay bant
X[k, 0, :, 7:9] Dikey bant
torch.randint(0, 2, (n,)) Rastgele etiketler

İleri seviye bölümündeki tüm dersler