GAN (Generative Adversarial Networks)

GAN (Generative Adversarial Networks), derin öğrenme alanında kullanılan bir yapay zeka modelidir. GAN’lar, iki temel bileşenden oluşan bir çerçeveye sahiptir: bir üretici (generator) ve bir ayırt edici (discriminator).

Üretici, rastgele gürültüden başlayarak veriye benzer örnekler üretmeye çalışır. Örneğin, bir GAN’ı eğitirken, üretici, insan yüzlerine benzer görüntüler üretebilir. Başlangıçta bu üretilen örnekler genellikle düşük kalitede ve gerçekçi olmayabilir.

Ayırt edici ise, gerçek veri örneklerini (örneğin, gerçek insan yüzleri) ve üreticinin ürettiği örnekleri birbirinden ayırt etmeye çalışır. Ayırt edici, gerçek ve üretilmiş örnekleri karşılaştırarak gerçekçilik düzeyini değerlendirir.

GAN’lar, üretici ve ayırt ediciyi birbirine karşı çalıştırarak rekabet etmelerini sağlar. Üretici, ayırt edicinin ürettiği örnekleri yanıltmaya ve gerçekçi örnekler üretmeye çalışırken, ayırt edici ise gerçek örnekleri doğru bir şekilde tanımlayabilmeye ve üretici tarafından üretilen örnekleri tespit edebilmeye çalışır.

Eğitim süreci ilerledikçe, GAN’lar daha gerçekçi örnekler üretmeyi öğrenirler. Üretici ve ayırt edici arasındaki rekabet sonucunda, üretici daha iyi örnekler üretmekte ve ayırt edici ise daha zorlandıkça zorlanmaktadır. İdeal olarak, bu rekabet sonucunda üretici gerçek örneklerle hemen hemen aynı kalitede örnekler üretebilir.

GAN’lar, sanat, müzik, metin ve görüntü oluşturma gibi birçok alanda kullanılabilir. Aynı zamanda, görüntü tamamlama, veri artırma ve sentezleme gibi uygulamalarda da etkili olabilirler. GAN’lar, yaratıcı içeriklerin üretilmesinde ve veri analizinde önemli bir rol oynamaktadır.

GAN kullanarak veri üretimi gerçekleştirmek için Python ile TensorFlow ve Keras gibi kütüphaneleri kullanabiliriz. Aşağıda, basit bir GAN modelini oluşturarak veri üretimini nasıl gerçekleştirebileceğinizi gösteren bir örnek kod bulunmaktadır:

import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers

# Veri seti oluşturma (örnek olarak 2D dağılım kullanacağız)
num_examples = 1000
latent_dim = 2

# Gerçek veri setini oluşturma (örnek olarak daire şeklinde dağılım)
theta = 2 * np.pi * np.random.rand(num_examples)
r = 5 * np.random.rand(num_examples)
real_data = np.array([r * np.cos(theta), r * np.sin(theta)]).T

# Üretici modeli oluşturma
generator = keras.Sequential(
    [
        layers.Dense(16, input_dim=latent_dim, activation="relu"),
        layers.Dense(16, activation="relu"),
        layers.Dense(2),
    ],
    name="generator",
)

# Ayırt edici modeli oluşturma
discriminator = keras.Sequential(
    [
        layers.Dense(16, input_dim=2, activation="relu"),
        layers.Dense(16, activation="relu"),
        layers.Dense(1, activation="sigmoid"),
    ],
    name="discriminator",
)

# Üretici ve ayırt ediciyi birleştirerek GAN modelini oluşturma
gan = keras.Sequential([generator, discriminator])

# Ayırt ediciyi eğitme
discriminator.compile(loss="binary_crossentropy", optimizer="adam")
discriminator.trainable = True
discriminator.fit(real_data, np.ones(num_examples), batch_size=32, epochs=20)

# GAN modelini eğitme
gan.compile(loss="binary_crossentropy", optimizer="adam")
discriminator.trainable = False

for epoch in range(100):
    # GAN'ı eğitmeden önce rastgele gürültü oluştur
    noise = np.random.normal(size=(num_examples, latent_dim))

    # Üretilmiş veriyi oluştur
    generated_data = generator.predict(noise)

    # Gerçek ve üretilmiş veriyi birleştir
    combined_data = np.concatenate([real_data, generated_data])
    labels = np.concatenate([np.ones(num_examples), np.zeros(num_examples)])

    # Ayırt ediciyi eğit
    discriminator.trainable = True
    discriminator.train_on_batch(combined_data, labels)

    # GAN'ı eğit (ayırt ediciyi kullanarak üreticiyi yanıltmaya çalışır)
    discriminator.trainable = False
    gan.train_on_batch(noise, np.ones(num_examples))

# Üretici tarafından üretilmiş veriyi görselleştir
generated_data = generator.predict(noise)
plt.scatter(real_data[:, 0], real_data[:, 1], label="Real Data")
plt.scatter(generated_data[:, 0], generated_data[:, 1], label="Generated Data")
plt.legend()
plt.show()

Bu örnekte, 2D bir dağılımı temsil eden veri setini kullanarak GAN modelini eğitiyoruz.

2D, iki boyutlu bir uzayı ifade eder. Bu örnekte, 2D veri seti, X ve Y koordinatlarından oluşan noktaların bir araya geldiği bir düzlemi temsil eder.

Diyelim ki her bir nokta, bir olayın veya bir nesnenin belirli özelliklerini temsil ediyor. Örneğin, bir müşterinin geliri ve yaşını ele alalım. Gelir, X ekseni üzerinde temsil edilecek ve yaş, Y ekseni üzerinde temsil edilecektir. Her bir nokta, müşterinin gelir ve yaşına karşılık gelir.

Bu şekilde, her bir nokta veri setinde bir gözlemi temsil eder ve bu gözlemler X-Y düzlemine dağılmıştır. Bu dağılım, veri setinin belirli bir desen veya yapısı olduğu durumlarda analiz ve modelleme için kullanılabilir.

Örneğin, GAN modelini kullanarak bu veri setinde gerçekçi müşteri profilleri üretebiliriz. GAN, bu 2D veri setindeki dağılımı öğrenerek, benzer özelliklere sahip yeni müşteri profilleri üretebilir. Bu, pazarlama stratejileri veya müşteri segmentasyonu gibi alanlarda kullanışlı olabilir.