AI & GPU
كيفية فهم سهل لشبكات التوليد المضادة (GANs) في PyTorch للمبتدئين

كيفية فهم سهل لشبكات التوليد المضادة (GANs) في PyTorch للمبتدئين

I. مقدمة لشبكات التوليد المضادة الجديرة بالملاحظة (جان) A. تعريف GANs والعناصر الرئيسية لها:

  • GANs هي فئة من نماذج التعلم الآلي تتألف من شبكتين عصبيتين, مولد ومميز, يتم تدريبهما في عملية تجادلية.
  • الشبكة المولدة مسئولة عن إنتاج عينات واقعية (مثل الصور والنصوص والموسيقى) من فضاء مدخلات ضمني.
  • الشبكة الفاصلة مدربة لتمييز بين العينات الحقيقية في البيانات والعينات الوهمية التي يولدها المولد.
  • يتم تدريب الشبكتين بطريقة تجادلية، حيث يحاول المولد خداع الفاصلة والفاصلة تحاول تصنيف العينات الحقيقية والوهمية بشكل صحيح.

B. تاريخ GANs وتطورها السريع:

  • تم تقديم GANs لأول مرة في عام 2014 بواسطة ايان جودفيلو وزملائه كنهج جديد للتخصيص الإنتاجي.
  • منذ تقديمها، شهدت GANs تطورات كبيرة وتم تطبيقها على مجموعة واسعة من المجالات، مثل توليد الصور وتوليد النصوص وحتى تخليق الصوت.
  • بعض الأحداث الرئيسية في تطور GANs تشمل تقديم شبكات GANs الشرطية (CGANs) ، وشبكات GANs ذات التصعيد التدريجي (PGGANs).

II. إعداد بيئة PyTorch A. تثبيت PyTorch

  • PyTorch هي مكتبة تعلم آلي الشائعة مفتوحة المصدر توفر إطار عمل مرن وفعال لبناء وتدريب نماذج التعلم العميق ، بما في ذلك GANs.
  • لتثبيت PyTorch ، يمكنك اتباع دليل التثبيت الرسمي المقدم على موقع PyTorch (https://pytorch.org/get-started/locally/ (opens in a new tab)).
  • قد يختلف عملية التثبيت اعتمادًا على نظام التشغيل الخاص بك وإصدار Python ونسخة CUDA (إذا كنت تستخدم وحدة معالجة الرسومات).

B. استيراد المكتبات والوحدات اللازمة

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

III. فهم بنية GAN A. شبكة المولد

  1. هيكل الإدخال والإخراج

    • تأخذ شبكة المولد متجه إدخال ضمني (على سبيل المثال, متجه ضوضاء عشوائي) وتُخرج عينة مولّدة (على سبيل المثال صورة).
    • يعتمد حجم المتجه الضوضاء الإدخالي وعينة الإخراج على المشكلة المحددة والإخراج المرغوب.
  2. طبقات الشبكة ووظائف التنشيط

    • تتكون شبكة المولد عادة من سلسلة من الطبقات المتصلة بالكامل أو الطبقات التحفيزية ، اعتمادًا على مجال المشكلة.
    • يتم استخدام وظائف التنشيط مثل ReLU أو Leaky ReLU أو tanh بشكل شائع في شبكة المولد.
  3. تحسين الإنتاج باستخدام المولد

    • يتم تدريب شبكة المولد لإنتاج عينات يمكن أن تخدع شبكة الفاصلة.
    • تتم تصميم وظيفة الخسائر لشبكة المولد لتعظيم احتمالية تصنيف الفاصلة للعينات المولّدة على أنها حقيقية.

B. شبكة الفاصلة

  1. هيكل الإدخال والإخراج

    • تأخذ شبكة الفاصلة عينةً (سواء كانت حقيقية من مجموعة البيانات أو تم إنشاؤها بواسطة المولد) وتُخرج احتمالية العينة بداية حقيقية.
    • حجم الإدخال للفاصلة يعتمد على حجم العينات (مثل حجم الصورة) ، ويكون الإخراج قيمة علامية طبلاً تتراوح بين 0 و 1.
  2. طبقات الشبكة ووظائف التنشيط

    • يتكون شبكة الفاصلة عادة من سلسلة من الطبقات التحفيزية أو الطبقات المتصلة بالكامل ، اعتمادًا على مجال المشكلة.
    • تُستخدم وظائف التنشيط مثل Leaky ReLU أو sigmoid عادةً في شبكة الفاصلة.
  3. تحسين الانتقاء باستخدام الفاصلة

    • يتم تدريب شبكة الفاصلة لتصنيف العينات الحقيقية من مجموعة البيانات على أنها حقيقية والعينات المُولدة على أنها وهمية.
    • يتم تصميم وظيفة الخسارة لشبكة الفاصلة لتعظيم احتمالية تصنيف العينات الحقيقية والوهمية بشكل صحيح.

C. عملية التدريب المجادلة

  1. وظائف الخسارة للمولد والفاصلة

    • يتم تصميم وظيفة الخسارة للمولد لتعظيم احتمالية تصنيف الفاصلة للعينات المولدة على أنها حقيقية.
    • يتم تصميم وظيفة الخسارة للفاصلة لتعظيم احتمالية تصنيف العينات الحقيقية والوهمية بشكل صحيح.
  2. التحسين المتناوب بين المولد والفاصلة

    • ينطوي عملية التدريب على التبادل بين تحديث شبكة المولد وشبكة الفاصلة.
    • أولاً ، يتم تدريب الفاصلة لتحسين قدرتها على تمييز العينات الحقيقية والوهمية.
    • ثم يتم تدريب المولد لتحسين قدرته على إنتاج عينات يمكن أن تخدع الفاصلة.
    • تستمر عملية التدريب المجادلة هذه حتى يصل المولد والفاصلة إلى حالة مستقرة.

IV. تنفيذ GAN بسيط في PyTorch A. تحديد نماذج المولد والفاصلة

  1. بناء شبكة المولد

    class Generator(nn.Module):
        def __init__(self, latent_dim, img_shape):
            super(Generator, self).__init__()
            self.latent_dim = latent_dim
            self.img_shape = img_shape
     
            self.model = nn.Sequential(
                nn.Linear(self.latent_dim, 256),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(256, 512),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(512, 1024),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(1024, np.prod(self.img_shape)),
                nn.Tanh()
            )
     
        def forward(self, z):
            img = self.model(z)
            img = img.view(img.size(0), *self.img_shape)
            return img
  2. بناء شبكة الفاصلة

    class Discriminator(nn.Module):
        def __init__(self, img_shape):
            super(Discriminator, self).__init__()
            self.img_shape = img_shape
     
            self.model = nn.Sequential(
                nn.Linear(np.prod(self.img_shape), 512),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(512, 256),
                nn.LeakyReLU(0.2, inplace=True),
                nn.Linear(256, 1),
                nn.Sigmoid()
            )
     
        def forward(self, img):
            img_flat = img.view(img.size(0), -1)
            validity = self.model(img_flat)
            return validity

B. إعداد حلقة التدريب

  1. تهيئة المولد والفاصلة

    latent_dim = 100
    img_shape = (1, 28, 28)  # مثال لمجموعة بيانات MNIST
     
    generator = Generator(latent_dim, img_shape)
    discriminator = Discriminator(img_shape)
  2. تحديد وظائف الخسارة

    adversarial_loss = nn.BCELoss()
     
    def generator_loss(fake_output):
        return adversarial_loss(fake_output, torch.ones_like(fake_output))
     
    def discriminator_loss(real_output, fake_output):
        real_loss = adversarial_loss(real_output, torch.ones_like(real_output))
        fake_loss = adversarial_loss(fake_output, torch.zeros_like(fake_output))
        return (real_loss + fake_loss) / 2
  3. التحسين المتناوب بين المولد والفاصلة

    num_epochs = 200
    batch_size = 64
     
    # محسّنون
    generator_optimizer = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))
    discriminator_optimizer = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))
     
    for epoch in range(num_epochs):
        # تدريب الفاصلة
        discriminator.zero_grad()
        real_samples = next(iter(dataloader))[0]
        real_output = discriminator(real_samples)
        fake_noise = torch.randn(batch_size, latent_dim)
        fake_samples = generator(fake_noise)
        fake_output = discriminator(fake_samples.detach())
        d_loss = discriminator_loss(real_output, fake_output)
        d_loss.backward()
        discriminator_optimizer.step()
     
        # تدريب المولد
        generator.zero_grad()
        fake_noise = torch.randn(batch_size, latent_dim)
        fake_samples = generator(fake_noise)
        fake_output = discriminator(fake_samples)
        g_loss = generator_loss(fake_output)
        g_loss.backward()
        generator_optimizer.step()

C. رصد تقدم التدريب

  1. تصور العينات المولدة

    # إنتاج العينات وعرضها
    fake_noise = torch.randn(64, latent_dim)
    fake_samples = generator(fake_noise)
    plt.figure(figsize=(8, 8))
    plt.axis("off")
    plt.imshow(np.transpose(vutils.make_grid(fake_samples.detach()[:64], padding=2, normalize=True), (1, 2, 0)))
    plt.show()
  2. تقييم أداء GAN

    • يمكن أن يكون تقييم أداء GAN تحديًا، حيث لا يوجد معيار واحد يمكنه أن يلتقط جميع جوانب العينات المولّدة.
    • يشمل المقاييس المستخدمة بشكل شائع معدل التفوق (IS) ومسافة التفوق الفريديشية (FID)، والتي تقيم جودة وتنوع العينات المولّدة.

V. شبكات التوليد المضادة الشرطية (cGANs) A. الدافع والتطبيقات الخاصة بـ cGANs- GANات المشروطة (cGANs) هي تمديد لإطار العمل القياسي لGAN الذي يسمح بتوليد عينات مشروطة على معلومات محددة مدخلة ، مثل تصنيف الفئة ، أو وصف النص ، أو بيانات مساعدة أخرى.

  • يمكن أن تكون cGANs مفيدة في التطبيقات التي ترغب في توليد عينات لها سمات أو خصائص محددة ، مثل توليد صور لفئة كائن معين أو توليد الترجمات من النص إلى الصورة.

    ب. تعديل هندسة GAN للتوليد المشروط

    1. دمج معلومات العلامة في المولد والمميز

      • في cGAN ، يتم تعديل شبكات المولد والمميز لاستلام مدخل إضافي ، وهو المعلومات المشروطة (على سبيل المثال ، تصنيف الفئة ، وصف النص).
      • يمكن تحقيق ذلك عن طريق دمج المدخل المشروط مع المدخل الكامن للمولد ، ومع العينة الحقيقية / الوهمية للمميز.
    2. تحديد وظائف الخسارة للمولد والمميز في cGANs

      • وظائف الخسارة للمولد والمميز في cGAN مشابهة لـ GAN القياسي ، ولكنها أيضًا تأخذ في الاعتبار المعلومات المشروطة.
      • على سبيل المثال ، تهدف خسارة المميز لتصنيف العينات الحقيقية والعينات الوهمية بناءً على معلومات العلامة المقدمة.

    ج. تطبيق cgan في بيثورش

    1. تعريف نماذج cGAN
      class ConditionalGenerator(nn.Module):
          def __init__(self, latent_dim, num_classes, img_shape):
              super(ConditionalGenerator, self).__init__()
              self.latent_dim = latent_dim
              self.num_classes = num_classes
              self.img_shape = img_shape
       
              self.model = nn.Sequential(
                  nn.Linear(self.latent_dim + self.num_classes, 256),
                  nn.LeakyReLU(0.2, inplace=True),
                  nn.Linear(256, 512),
                  nn.LeakyReLU(0.2, inplace=True),
                  nn.Linear(512, 1024),
                  nn.LeakyReLU(0.2, inplace=True),
                  nn.Linear(1024, np.prod(self.img_shape)),
                  nn.Tanh()
              )
       
          def forward(self, z, labelsفي هذا البرنامج التعليمي، تعلمت عن المكونات الرئيسية لعملية التدريب لنماذج التعلم العميق، بما في ذلك أجهزة الأمثلة، ووظائف الخطأ، ومقاييس التقييم، وتقنيات التنظيم، وحفظ وتحميل النماذج. من خلال فهم هذه المفاهيم وتطبيقها في مشاريع التعلم العميق الخاصة بك، ستكون على الطريق الصحيح لبناء وتدريب النماذج ذات الأداء العالي التي يمكنها حل مجموعة واسعة من المشكلات.

تذكر، التعلم العميق هو مجال متطور باستمرار، وهناك دائما المزيد للتعلم. استمر في استكشاف وتجريب الأفكار الجديدة، ومواكبة التطورات الأحدث في المجال. حظا طيبا وفقك الله في مستقبلك في التعلم العميق!