জেনারেটর (Generator) এবং ডিসক্রিমিনেটর (Discriminator) মডেলগুলি জেনারেটিভ অ্যাডভারসারিয়াল নেটওয়ার্ক (GAN) এর দুটি প্রধান উপাদান। GAN একটি ডিপ লার্নিং মডেল যা দুটি নেটওয়ার্কের মধ্যে একটি "অ্যাডভারসারিয়াল" প্রক্রিয়া তৈরি করে। এই দুটি নেটওয়ার্ক একটি পদ্ধতিগত "প্রতিযোগিতা" এর মাধ্যমে একে অপরকে উন্নত করে।
- জেনারেটর: এটি একটি মডেল যা নতুন, বাস্তবসম্মত ডেটা তৈরি করতে চেষ্টা করে। উদাহরণস্বরূপ, এটি একটি নতুন ছবি তৈরি করতে পারে যা আসল ছবির মতো দেখায়।
- ডিসক্রিমিনেটর: এটি একটি মডেল যা নির্ধারণ করতে চেষ্টা করে যে, একটি ইনপুট ছবি আসল কি না, অর্থাৎ সেটি আসল ডেটাসেট থেকে এসেছে, নাকি জেনারেটরের দ্বারা তৈরি হয়েছে।
এখন, আমি এখানে একটি টেনসরফ্লো ব্যবহার করে জেনারেটর এবং ডিসক্রিমিনেটর মডেল তৈরি করার একটি সাধারণ উদাহরণ দেব।
Generator (জেনারেটর) মডেল
জেনারেটর একটি র্যান্ডম নইজ ভেক্টর ইনপুট হিসেবে নিয়ে একটি নতুন ইমেজ তৈরি করতে চায়। এটি সাধারণত Fully Connected (Dense) লেয়ার বা Conv2DTranspose লেয়ার ব্যবহার করে।
import tensorflow as tf
from tensorflow.keras import layers
def build_generator(latent_dim):
model = tf.keras.Sequential()
# Dense layer to start expanding the random noise (latent vector)
model.add(layers.Dense(256, input_dim=latent_dim))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.BatchNormalization(momentum=0.8))
# Further expansion layers
model.add(layers.Dense(512))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.BatchNormalization(momentum=0.8))
model.add(layers.Dense(1024))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.BatchNormalization(momentum=0.8))
# Output layer to reshape into a 28x28x1 image (for MNIST example)
model.add(layers.Dense(28 * 28 * 1, activation='tanh'))
model.add(layers.Reshape((28, 28, 1)))
return model
এখানে, আমরা একটি latent_dim ব্যবহার করছি যা র্যান্ডম নইজ ভেক্টরের আকার। এই আকারটি নিয়ন্ত্রণ করে যে জেনারেটর কতটা কমপ্লেক্স ডেটা তৈরি করতে সক্ষম।
Discriminator (ডিসক্রিমিনেটর) মডেল
ডিসক্রিমিনেটর একটি নিউরাল নেটওয়ার্ক যা একটি ইমেজ ইনপুট হিসেবে নিয়ে এটি যাচাই করে যে, ছবিটি আসল নাকি জেনারেটর দ্বারা তৈরি। ডিসক্রিমিনেটরের সাধারণ আর্কিটেকচার Conv2D লেয়ারগুলির সংমিশ্রণ হতে পারে।
def build_discriminator(img_shape):
model = tf.keras.Sequential()
# Convolutional layers to learn features from image
model.add(layers.Conv2D(64, kernel_size=3, strides=2, input_shape=img_shape, padding='same'))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.Dropout(0.3))
model.add(layers.Conv2D(128, kernel_size=3, strides=2, padding='same'))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.Dropout(0.3))
model.add(layers.Conv2D(256, kernel_size=3, strides=2, padding='same'))
model.add(layers.LeakyReLU(alpha=0.2))
model.add(layers.Dropout(0.3))
model.add(layers.Flatten())
model.add(layers.Dense(1, activation='sigmoid')) # Output whether the image is real or fake
return model
এই মডেলটি ইমেজের বৈশিষ্ট্যগুলি কনভোলিউশনাল লেয়ার ব্যবহার করে শেখে এবং শেষে একটি sigmoid অ্যাক্টিভেশন ফাংশন ব্যবহার করে ফলাফল দেয়।
GAN (Generative Adversarial Network)
জেনারেটর এবং ডিসক্রিমিনেটরের মধ্যে প্রতিযোগিতা তৈরি করতে, আমরা একটি GAN তৈরি করতে পারি। এখানে জেনারেটর এবং ডিসক্রিমিনেটর মডেল দুটি আলাদাভাবে তৈরি করা হয় এবং তারপর এগুলিকে একসাথে ট্রেনিং করার জন্য একটি অপটিমাইজার এবং নস্ট ফাংশন যোগ করা হয়।
def build_gan(generator, discriminator):
# Make discriminator not trainable during the generator training
discriminator.trainable = False
# GAN model (generator + discriminator)
model = tf.keras.Sequential()
model.add(generator)
model.add(discriminator)
return model
এটি একটি সাধারণ GAN মডেল তৈরি করে, যেখানে জেনারেটর নতুন ডেটা তৈরি করে এবং ডিসক্রিমিনেটর সেই ডেটার সত্যতা যাচাই করে।
ট্রেনিং লুপ
GAN-এর ট্রেনিং করার সময়, আমরা দুইটি ধাপে কাজ করি:
- ডিসক্রিমিনেটর আপডেট করা: ডিসক্রিমিনেটর বাস্তব এবং জেনেরেটেড ডেটা উভয়ের ভিত্তিতে শেখে।
- জেনারেটর আপডেট করা: জেনারেটর, ডিসক্রিমিনেটরের প্রতিক্রিয়া ব্যবহার করে তার আউটপুট আরও বাস্তবসম্মত করতে শেখে।
# Set image shape for MNIST data (28x28 grayscale images)
img_shape = (28, 28, 1)
latent_dim = 100
# Build the models
generator = build_generator(latent_dim)
discriminator = build_discriminator(img_shape)
gan = build_gan(generator, discriminator)
# Compile discriminator and GAN
discriminator.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
gan.compile(loss='binary_crossentropy', optimizer='adam')
সারাংশ
এখানে, আমরা জেনারেটর এবং ডিসক্রিমিনেটর মডেল তৈরি করেছি এবং তারপর GAN গঠন করেছি। এটি একটি সাধারণ উদাহরণ যা MNIST ডেটাসেটে কাজ করতে পারে। GAN মডেলটি দুটি অংশে বিভক্ত: একটি অংশ নতুন ডেটা তৈরি করে (জেনারেটর), এবং অন্যটি তৈরি করা ডেটা যাচাই করে (ডিসক্রিমিনেটর)।
Read more