კომპიუტერული ხედვა Jupyter ნოუთბუქი · TensorFlow

გენერაციული საპირისპირო ქსელები

ეს არის პრაქტიკული ნოუთბუქი. წაიკითხე კოდი და შედეგები აქ, ან გაუშვი ინტერაქტიულად Google Colab-ში ან Jupyter-ში.

Generative Adversarial Network (GAN) მთავარი მიზანია შექმნას სურათები, რომლებიც მსგავსია (მაგრამ არა იდენტური) სასწავლო მონაცემთა ნაკრებისთვის.

GAN შედგება ორი ნერვული ქსელისგან, რომლებიც გაწვრთნიან ერთმანეთის წინააღმდეგ:

  • გენერატორი იღებს შემთხვევით ვექტორს და უნდა გამოიმუშაოს მისგან გამოსახულება
  • Discriminator არის ქსელი, რომელმაც უნდა განასხვავოს ორიგინალური სურათი (სავარჯიშო მონაცემთა ნაკრებიდან) და გენერატორის მიერ გამომუშავებული.

იტვირთება…

გენერატორი

გენერატორის როლი არის გარკვეული ზომის შემთხვევითი ვექტორის აღება (ის მსგავსია ავტოენკოდერებში ლატენტური ვექტორის) და სამიზნე გამოსახულების გენერირება. ის ძალიან ჰგავს ავტოენკოდერის გენერაციულ მხარეს.

ჩვენს მაგალითში ჩვენ გამოვიყენებთ მკვრივ ნერვულ ქსელებს და MNIST მონაცემთა ბაზას.

იტვირთება…

გენერატორში გამოყენებული რამდენიმე ხრიკი:

  • ReLU-ს ნაცვლად, ვიყენებთ Leaky ReLU, ანუ ReLU, რომელიც არ არის ზუსტად 0 უარყოფითი $x$-ისთვის, არამედ სხვა წრფივ ფუნქციას ძალიან მცირე დახრილობით. ეს მნიშვნელოვანია, რადგან ის ეხმარება გრადიენტულ დაცემას მნიშვნელობების გავრცელებაში, მაშინაც კი, თუ ჩვენ ვიმყოფებით ReLU-ს უარყოფით მხარეზე (სადაც მნიშვნელობები არის 0)
  • ჩვენ ვიყენებთ Batch ნორმალიზებას ტრენინგის სტაბილიზაციის მიზნით
  • ბოლო შრეზე აქტივაციის ფუნქციაა tanh, ამიტომ გამომავალი არის [-1,1] დიაპაზონში.

დისკრიმინატორი

დისკრიმინატორი არის კლასიკური გამოსახულების კლასიფიკაციის ქსელი. ჩვენს პირველ მაგალითში ჩვენ ასევე გამოვიყენებთ მკვრივ კლასიფიკატორს.

იტვირთება…

ჩვენ ასევე განვსაზღვრავთ მოწინააღმდეგე ქსელს, რომელიც არის გენერატორი, რასაც მოჰყვება დისკრიმინატორი. ეს ქსელი იწყება ხმაურის ვექტორით და აბრუნებს ორობით შედეგს.

იტვირთება…

მონაცემთა ნაკრების ჩატვირთვა

ჩვენ გამოვიყენებთ MNIST მონაცემთა ბაზას, ჩაშენებულ Keras-ში:

იტვირთება…

ქსელის ტრენინგი

ტრენინგის თითოეულ საფეხურზე გვაქვს ორი ეტაპი:

  • ტრენინგის დისკრიმინატორი:
    • ჩვენ ვქმნით რამდენიმე შემთხვევით ვექტორს noise. ტრენინგი ტარდება მინი პაკეტებში, ამიტომ ჩვენ ვიყენებთ batch//2 ვექტორებს batch//2 გენერირებული სურათების შესაქმნელად
    • აირჩიე batch//2 შემთხვევითი სურათები მონაცემთა ნაკრებიდან
    • მოამზადეთ დისკრიმინატორი 50% რეალურ და 50% გენერირებულ სურათებზე, შესაბამისი ეტიკეტების მიწოდებით (0 ან 1)
  • ავარჯიშეთ გენერატორი კომბინირებული საპირისპირო მოდელის გამოყენებით, შემთხვევითი ვექტორების გადაცემით, როგორც შეყვანის სახით და ველით 1-ს, როგორც გამოსავალს (რაც შეესაბამება რეალურ სურათებს)
იტვირთება…
იტვირთება…
გამოტანა
epoch: 0, [Discriminator :: d_loss: 0.601463], [ Generator :: loss: 0.640677]
ნოუთბუქის გამოტანა
epoch: 500, [Discriminator :: d_loss: 0.192001], [ Generator :: loss: 12.124918]
ნოუთბუქის გამოტანა
epoch: 1000, [Discriminator :: d_loss: 0.141956], [ Generator :: loss: 1.900380]
ნოუთბუქის გამოტანა
epoch: 1500, [Discriminator :: d_loss: 0.293635], [ Generator :: loss: 2.443017]
ნოუთბუქის გამოტანა

ამოცანა: შეგიძლიათ ამ GAN-ის სწავლება MNIST-ის მთელ მონაცემთა ბაზაზე და ნახოთ, რამდენად კარგი იქნება იგი

DCGAN

წინა მაგალითში, ჩვენ გამოვიყენეთ მკვრივი ქსელები როგორც გენერატორისთვის, ასევე დისკრიმინატორისთვის, მაგრამ ვიცით, რომ CNN-ები უკეთეს შესრულებას იძლევა სურათებთან ურთიერთობისას. Deep Convolutional GAN მსგავსია ზემოთ მოყვანილი არქიტექტურისა, მაგრამ ის იყენებს კონვოლუციურ შრეებს გენერატორისა და დისკრიმინატორისთვის.

მთავარი სირთულე აქ არის დენერატორისთვის არქიტექტურის აგება, რადგან მან უნდა გააკეთოს შებრუნებული დავალება ტრადიციულ CNN-თან შედარებით - მან უნდა შექმნას სურათი მხატვრული ვექტორიდან. გარკვეულწილად, ეს ჰგავს ავტოენკოდერების დეკოდერის ნაწილს. ამიტომ ჩვენ გამოვიყენებთ Conv2DTranspose ფენებს გენერატორში.

იტვირთება…
გამოტანა
-1.0 1.0
იტვირთება…
გამოტანა
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_7 (Dense)              (None, 6272)              633472    
_________________________________________________________________
reshape_1 (Reshape)          (None, 7, 7, 128)         0         
_________________________________________________________________
up_sampling2d (UpSampling2D) (None, 14, 14, 128)       0         
_________________________________________________________________
conv2d_transpose (Conv2DTran (None, 14, 14, 128)       147584    
_________________________________________________________________
batch_normalization_3 (Batch (None, 14, 14, 128)       512       
_________________________________________________________________
activation (Activation)      (None, 14, 14, 128)       0         
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 28, 28, 128)       0         
_________________________________________________________________
conv2d_transpose_1 (Conv2DTr (None, 28, 28, 64)        73792     
_________________________________________________________________
batch_normalization_4 (Batch (None, 28, 28, 64)        256       
_________________________________________________________________
activation_1 (Activation)    (None, 28, 28, 64)        0         
_________________________________________________________________
conv2d_transpose_2 (Conv2DTr (None, 28, 28, 1)         577       
_________________________________________________________________
activation_2 (Activation)    (None, 28, 28, 1)         0         
=================================================================
Total params: 856,193
Trainable params: 855,809
Non-trainable params: 384
_________________________________________________________________
იტვირთება…
იტვირთება…
იტვირთება…
გამოტანა
epoch: 0, [Discriminator :: d_loss: 0.957905], [ Generator :: loss: 0.695994]
ნოუთბუქის გამოტანა
epoch: 100, [Discriminator :: d_loss: 0.826593], [ Generator :: loss: 1.488088]
ნოუთბუქის გამოტანა
epoch: 200, [Discriminator :: d_loss: 0.602254], [ Generator :: loss: 1.362499]
ნოუთბუქის გამოტანა
epoch: 300, [Discriminator :: d_loss: 0.711605], [ Generator :: loss: 1.224355]
ნოუთბუქის გამოტანა

ამოცანა: სცადეთ უფრო რთული ფერადი სურათების გენერირება DCGAN-ით - მაგალითად, აიღეთ ერთი კლასი CIFAR-10 მონაცემთა ბაზიდან.

ტრენინგი ფერწერაზე

GAN-ის ტრენინგის ერთ-ერთი კარგი კანდიდატია ადამიანის მხატვრების მიერ შექმნილი ნახატები. ქვემოთ მოცემულია DCGAN-ის მიერ მომზადებული სურათის ნიმუში, რომელიც მომზადებულია WikiArt-ის მონაცემთა ბაზაზე. კერაგანი ბიბლიოთეკა გამოიყენეს ამ სურათის შესაქმნელად Azure Machine Learning-ის გამოყენებით

(ფოტო ხელოვნური ხელოვნება კოლექციიდან)

ცნობები

  • სხვადასხვა სათამაშო GAN არქიტექტურის Keras განხორციელება
  • KeraGAN ბიბლიოთეკა
  • ბლოგის პოსტი Azure ML-ზე GAN-ების შექმნის შესახებ

ეს გაკვეთილი არის Microsoft “AI for Beginners” კურსის ქართული თარგმანი, გავრცელებული MIT ლიცენზიით.