CodeBlanks Logo Icon CodeBlanks

Discriminator

Discriminator, gerçek ve sahte verileri ayırt eder.

Ayırt edici

Ayırt edici sıradan bir ikili sınıflandırıcıdır: gerçek örneklere 1, üreticinin örneklerine 0 etiketi verilir. Görüntülerde genellikle evrişimli bir ağdır ve sigmoid ile biter:

D = nn.Sequential(
    nn.Linear(784, 256), nn.LeakyReLU(0.2),
    nn.Linear(256, 1), nn.Sigmoid())

LeakyReLU, negatif bölgede de gradyan geçirdiği için GAN'larda ReLU'ya tercih edilir; böylece üretici her durumda geri bildirim alır.

Ayırt ediciyi ölçü olarak kullanmak

Bir üreticinin kalitesini sezgisel ölçmenin yolu, gerçek ve sahte örneklere yeni bir sınıflandırıcı eğitmektir (C2ST testi). Sınıflandırıcı ne kadar zorlanırsa üretici o kadar iyidir:

X = np.r_[gercek, sahte].reshape(-1, 1)
y = np.r_[np.ones(n), np.zeros(n)]
skor = cross_val_score(LogisticRegression(), X, y, cv=5).mean()

Not: doğrusal bir sınıflandırıcı yalnızca ortalama farkını görebilir; varyans farkı için daha esnek bir model ya da öznitelik (x²) gerekir.

Uygulama C2ST ile üretici sınamak

c2st(gercek, sahte) fonksiyonunu yaz: örnekleri birleştir, öznitelik olarak [x, x**2] kullan, LogisticRegression ile 5 katlı çapraz doğrulama doğruluğunu döndür. Verilen üç üretici için (kötü, orta, iyi) skorları round(..., 2) ile aynı satırda yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

rng = np.random.default_rng(0)
n = 2000
gercek = rng.normal(4, 1.5, n)
ureticiler = [rng.normal(0, 1, n), rng.normal(4, 0.5, n), rng.normal(4, 1.5, n)]

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

rng = np.random.default_rng(0)
n = 2000
gercek = rng.normal(4, 1.5, n)
ureticiler = [rng.normal(0, 1, n), rng.normal(4, 0.5, n), rng.normal(4, 1.5, n)]

def c2st(gercek, sahte):
    x = np.r_[gercek, sahte]
    X = np.c_[x, x ** 2]
    y = np.r_[np.ones(len(gercek)), np.zeros(len(sahte))]
    return cross_val_score(LogisticRegression(max_iter=1000), X, y, cv=5).mean()

print(*[round(c2st(gercek, s), 2) for s in ureticiler])

Beklenen çıktı

0.95 0.75 0.5

Soru ve cevaplar

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

1 Ayırt edicinin doğruluğu 0.5'e düşerse bu ne anlama gelir?

  • Üretici çöktü
  • Veri yanlış etiketli
  • Gerçek ve sahte ayırt edilemiyor; üretici başarılı Doğru cevap
  • Ayırt edici çok iyi

Açıklama: 0.5 doğruluk, ikili sınıflandırmada şans seviyesidir.

2 Ayırt edicide negatif bölgede de gradyan geçir.

Soru
nn.Linear(784, 256), nn.____(0.2)
Cevap
nn.Linear(784, 256), nn.LeakyReLU(0.2)

Açıklama: LeakyReLU(0.2) negatif girişleri 0.2 ile çarpar.

3 Eşleştir.

Kavram Anlamı
gerçek etiketi 1
sahte etiketi 0
doğruluk ≈ 0.5 İyi üretici
doğruluk ≈ 1 Kötü üretici

Uzman bölümündeki tüm dersler