Generator এবং Discriminator মডেল তৈরি

Generative Adversarial Networks (GANs) - কেরাস ডিপ লার্নিং (Deep Learning with Keras) - Machine Learning

373

Generative Adversarial Networks (GANs) একটি জনপ্রিয় ডীপ লার্নিং মডেল যা দুটি মূল অংশ নিয়ে গঠিত: Generator এবং Discriminator। এই দুটি মডেল একে অপরের বিপরীতে কাজ করে, যার মাধ্যমে তাদের মধ্যে একটি "অ্যাডভারসেরিয়াল" (adversarial) সম্পর্ক তৈরি হয়। এটি একটি নিউরাল নেটওয়ার্ক আর্কিটেকচার যা মূলত নতুন, বাস্তবসম্মত ডেটা তৈরি করতে ব্যবহৃত হয়।

  1. Generator: এটি নতুন ডেটা তৈরি করে, যেমন চিত্র, শব্দ বা টেক্সট। Generator মডেলটি সাধারণত random noise থেকে শুরু করে এবং ধীরে ধীরে এমন একটি ডেটা তৈরি করতে চেষ্টা করে যা Discriminator মডেল দ্বারা আসল মনে হয়।
  2. Discriminator: এটি যাচাই করে যে Generator এর তৈরি ডেটা আসল ডেটার সাথে কতটা মিল। Discriminator মডেলটি একটি ক্লাসিফায়ার হিসেবে কাজ করে এবং প্রতিটি ইনপুট চিত্রকে দুটি শ্রেণীতে (অসল বা জেনারেটেড) শ্রেণীবদ্ধ করে।

Generator এবং Discriminator মডেল তৈরির ধাপ

এখানে একটি GAN তৈরি করার জন্য Generator এবং Discriminator মডেল কিভাবে তৈরি করা যায় তার উদাহরণ দেওয়া হলো। আমরা Keras এবং TensorFlow ব্যবহার করব।

১. Generator মডেল তৈরি করা

Generator একটি fully connected (FC) নিউরাল নেটওয়ার্ক হয় যা random noise vector কে ইনপুট হিসেবে গ্রহণ করে এবং একটি realistic image তৈরি করে। সাধারণত, Generator মডেলটি Dense, Reshape, LeakyReLU, এবং BatchNormalization লেয়ার ব্যবহার করে তৈরি হয়।

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Reshape, LeakyReLU, BatchNormalization
from tensorflow.keras.optimizers import Adam
import numpy as np

def build_generator(latent_dim):
    model = Sequential()

    # Fully connected layer
    model.add(Dense(128 * 7 * 7, activation=None, input_dim=latent_dim))
    model.add(Reshape((7, 7, 128)))  # Reshape to 7x7x128
    model.add(BatchNormalization(momentum=0.8))
    model.add(LeakyReLU(alpha=0.2))

    # Deconvolutional (Transpose Convolution) layers
    model.add(Dense(128, activation=None))
    model.add(Reshape((14, 14, 128)))
    model.add(BatchNormalization(momentum=0.8))
    model.add(LeakyReLU(alpha=0.2))

    # Final layer
    model.add(Dense(1, activation='tanh'))  # Output a 28x28 image

    model.summary()
    return model
  • latent_dim: এটা হলো ইনপুট noise vector এর আকার, যা প্রথমে random noise হিসেবে আসে।
  • Dense: ফুলি কানেক্টেড লেয়ার
  • LeakyReLU: অ্যাকটিভেশন ফাংশন যা নেগেটিভ ভ্যালুতে কিছু গ্র্যাডিয়েন্ট মঞ্জুর করে।
  • BatchNormalization: মডেলটিকে স্ট্যাবল রাখতে সাহায্য করে।

২. Discriminator মডেল তৈরি করা

Discriminator একটি সাধারণ binary classifier যা চিত্রের সঠিকতা নির্ধারণ করে। এটি real বা fake চিত্রকে পার্থক্য করতে শেখে।

from tensorflow.keras.layers import Flatten, Dense

def build_discriminator(img_shape):
    model = Sequential()

    # First hidden layer (Fully connected)
    model.add(Dense(512, input_shape=img_shape))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dense(256))
    model.add(LeakyReLU(alpha=0.2))

    # Output layer
    model.add(Dense(1, activation='sigmoid'))  # Sigmoid for binary classification (real/fake)

    model.summary()
    return model
  • Flatten: চিত্রকে একক ভেক্টরে রূপান্তরিত করতে ব্যবহৃত হয়।
  • Sigmoid: এটি একটি বাইনরি ক্লাসিফিকেশন মডেল, তাই আমরা sigmoid অ্যাকটিভেশন ব্যবহার করছি।

৩. GAN মডেল তৈরি করা

এখন, আমরা Generator এবং Discriminator মডেলগুলো একত্রে ব্যবহার করে GAN মডেল তৈরি করব। GAN মডেলটি একটি adversarial process এর মাধ্যমে কাজ করে, যেখানে Generator এবং Discriminator একে অপরের বিপরীতে কাজ করে।

from tensorflow.keras.models import Model

def build_gan(generator, discriminator):
    # Discriminator doesn't need to be trainable when building the GAN
    discriminator.trainable = False

    # GAN model: Generator -> Discriminator
    gan_input = layers.Input(shape=(latent_dim,))
    x = generator(gan_input)
    gan_output = discriminator(x)

    gan = Model(gan_input, gan_output)
    gan.compile(loss='binary_crossentropy', optimizer=Adam(learning_rate=0.0002, beta_1=0.5))
    
    gan.summary()
    return gan
  • Discriminator কে non-trainable করা হয় যখন GAN মডেলটি ট্রেন করা হচ্ছে, যাতে Generator মডেলটি উন্নত হতে পারে।
  • Binary Crossentropy: বাইনরি ক্লাসিফিকেশনের জন্য ব্যবহৃত লস ফাংশন।

৪. মডেল ট্রেনিং

আমরা এখন Generator এবং Discriminator মডেলগুলিকে একত্রে ট্রেন করতে পারি। সাধারণভাবে, ট্রেনিং প্রক্রিয়া নিম্নরূপ:

  1. Generator প্রথমে random noise থেকে fake images তৈরি করবে।
  2. Discriminator দুটি ইনপুট নিবে: 1) fake images (Generator থেকে) এবং 2) real images (প্রকৃত ডেটাসেট থেকে)। এটি fake images কে 0 (নেগেটিভ) এবং real images কে 1 (পজিটিভ) হিসেবে শ্রেণীবদ্ধ করবে।
  3. GAN মডেলটি Discriminator কে freeze করে এবং Generator এর লস কমানোর জন্য ট্রেন করবে।
def train_gan(generator, discriminator, gan, epochs, batch_size, latent_dim, X_train):
    batch_count = X_train.shape[0] // batch_size

    for epoch in range(epochs):
        for _ in range(batch_count):
            # 1. Random noise to generate fake images
            noise = np.random.normal(0, 1, (batch_size, latent_dim))
            generated_images = generator.predict(noise)

            # 2. Select random real images from dataset
            idx = np.random.randint(0, X_train.shape[0], batch_size)
            real_images = X_train[idx]

            # 3. Train the Discriminator: real images labeled as 1 and fake images as 0
            d_loss_real = discriminator.train_on_batch(real_images, np.ones((batch_size, 1)))
            d_loss_fake = discriminator.train_on_batch(generated_images, np.zeros((batch_size, 1)))

            d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

            # 4. Train the Generator (via GAN model, with Discriminator frozen)
            noise = np.random.normal(0, 1, (batch_size, latent_dim))
            g_loss = gan.train_on_batch(noise, np.ones((batch_size, 1)))

        print(f"Epoch: {epoch}, D Loss: {d_loss}, G Loss: {g_loss}")

৫. মডেল সংরক্ষণ এবং ফলাফল দেখা

ট্রেনিং শেষ হওয়ার পর, আপনি Generator এর দ্বারা তৈরি চিত্রগুলি দেখতে পারেন এবং মডেলটি সংরক্ষণ করতে পারেন।

# Save generator model
generator.save('generator_model.h5')

# View generated images
def plot_generated_images(epoch, generator, latent_dim, examples=10, dim=(1, 10), figsize=(10, 1)):
    noise = np.random.normal(0, 1, (examples, latent_dim))
    generated_images = generator.predict(noise)
    
    plt.figure(figsize=figsize)
    for i in range(examples):
        plt.subplot(dim[0], dim[1], i+1)
        plt.imshow(generated_images[i], interpolation='nearest')
        plt.axis('off')
    plt.tight_layout()
    plt.savefig(f"generated_images_epoch_{epoch}.png")
    plt.close()

plot_generated_images(100, generator, latent_dim)

সারাংশ

  • Generator মডেলটি random noise থেকে বাস্তবসম্মত চিত্র তৈরি করার জন্য ব্যবহৃত হয়।
  • Discriminator মডেলটি বাস্তব এবং জেনারেটেড চিত্রের মধ্যে পার্থক্য করতে শিখে।
  • GAN মডেলটি Generator এবং Discriminator এর প্রতিযোগিতামূলক ট্রেনিংয়ের মাধ্যমে বাস্তবসম্মত ডেটা তৈরি করে।

এভাবে Generator এবং Discriminator মডেলগুলি একত্রে কাজ করে একটি কার্যকর **Generative Ad

versarial Network (GAN)** তৈরি করে যা নতুন এবং বাস্তবসম্মত ডেটা তৈরি করতে সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...