├── images ├── 000.png ├── 001.png ├── 002.png ├── 003.png └── 004.png ├── __pycache__ └── helper.cpython-37.pyc ├── helper.py ├── README.md └── GANs.py /images/000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AhmetFurkanDEMIR/Generative-Adversarial-Networks-GAN/HEAD/images/000.png -------------------------------------------------------------------------------- /images/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AhmetFurkanDEMIR/Generative-Adversarial-Networks-GAN/HEAD/images/001.png -------------------------------------------------------------------------------- /images/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AhmetFurkanDEMIR/Generative-Adversarial-Networks-GAN/HEAD/images/002.png -------------------------------------------------------------------------------- /images/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AhmetFurkanDEMIR/Generative-Adversarial-Networks-GAN/HEAD/images/003.png -------------------------------------------------------------------------------- /images/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AhmetFurkanDEMIR/Generative-Adversarial-Networks-GAN/HEAD/images/004.png -------------------------------------------------------------------------------- /__pycache__/helper.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AhmetFurkanDEMIR/Generative-Adversarial-Networks-GAN/HEAD/__pycache__/helper.cpython-37.pyc -------------------------------------------------------------------------------- /helper.py: -------------------------------------------------------------------------------- 1 | import math 2 | import numpy as np 3 | 4 | 5 | def combine_images(generated_images): 6 | total,width,height = generated_images.shape[:-1] 7 | cols = int(math.sqrt(total)) 8 | rows = math.ceil(float(total)/cols) 9 | combined_image = np.zeros((height*rows, width*cols), 10 | dtype=generated_images.dtype) 11 | 12 | for index, image in enumerate(generated_images): 13 | i = int(index/cols) 14 | j = index % cols 15 | combined_image[width*i:width*(i+1), height*j:height*(j+1)] = image[:, :, 0] 16 | return combined_image 17 | 18 | 19 | def show_progress(epoch, batch, g_loss, d_loss, g_acc, d_acc): 20 | msg = "epoch: {}, batch: {}, g_loss: {}, d_loss: {}, g_accuracy: {}, d_accuracy: {}" 21 | print(msg.format(epoch, batch, g_loss, d_loss, g_acc, d_acc)) 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GAN Kullanım Alanları 2 | 3 | * Resim üretme 4 | * Resimde işelem 5 | * Çözünürlük arrtırma 6 | * Sanatsal 7 | * Gerçekçi resimler 8 | * Ses üretimi 9 | * Yaşlandırma 10 | 11 | # Generative Adversarial Networks-GAN 12 | 13 | * Ressimler ile öğrenip yeni resimler oluşturan sinir ağları 14 | * G (Generator) = üretici 15 | * D (Discriminator) = ayırt edici 16 | 17 | # Generative 18 | 19 | * input olarak rastgele bir gürültü alır çıktı olarak bir ressim verir. 20 | 21 | ![Screenshot_2020-03-11_19-08-00](https://user-images.githubusercontent.com/54184905/76454566-f35f6f80-63e5-11ea-9108-605b8028a0c3.png) 22 | 23 | # Adversarial 24 | 25 | * G ye rakip olarak görülür. D gerçek resimlere ulaşabilir ama G ulaşamaz, D gerçek ve G nin ürettiği resimleri alıp yorumlar ve bir çıktı verir. 26 | * Eğer tahmin doğru ise 1 e yaklaşır tahmin yanlış ise 0 a yaklaşır. 27 | * G den üretilen resimleri alır ve nerede hata yaptığını G ye söyler. 28 | 29 | ![Screenshot_2020-03-11_19-08-48](https://user-images.githubusercontent.com/54184905/76455095-7ed90080-63e6-11ea-9161-ed586310a162.png) 30 | 31 | (Yanlış resim ve 0 etiketi) 32 | 33 | ![Screenshot_2020-03-11_19-09-43](https://user-images.githubusercontent.com/54184905/76455103-80a2c400-63e6-11ea-8731-387f9e0e8caf.png) 34 | 35 | (Doğru resim ve 1 etiketi) 36 | 37 | # Algoritmaların Eğitimi 38 | 39 | * Her iki bölümde kod satırları boyunca kendilerini eğitirler. 40 | 41 | ![Screenshot_2020-03-11_19-12-58](https://user-images.githubusercontent.com/54184905/76455716-03c41a00-63e7-11ea-9c22-6c0e9f7e0f8a.png) 42 | 43 | (D eğitimi, G den gelen ve orjinal resimlerle bir orantı kurarak ağırlık verir ve biz bu ağırlıkları loss fonksiyonu ile performans kontrolü yapariz) 44 | 45 | ![Screenshot_2020-03-11_19-15-42](https://user-images.githubusercontent.com/54184905/76455724-058ddd80-63e7-11ea-87f1-281aac7b11e7.png) 46 | 47 | (G eğitimi, D den gelen ağırlıklar ile yeni resim çizer ve sonra tekrardan D ye iletir.) 48 | 49 | # Deconvolutional network 50 | 51 | * Normal CNN 'in tam tersi akış sağlar. 52 | * Çıkış olarak bir resim üretir. (Normal CNN giriş olarak alır resmi) 53 | 54 | ![Screenshot_2020-03-11_19-25-20](https://user-images.githubusercontent.com/54184905/76456506-2440a400-63e8-11ea-9106-6e4a93743272.png) 55 | 56 | ![Screenshot_2020-03-11_19-25-27](https://user-images.githubusercontent.com/54184905/76456508-2571d100-63e8-11ea-82a0-6288012fd338.png) 57 | 58 | # Kodlar 59 | 60 | * Kodları Aynı dizinde tutarak GANs.py üzerinden eğitime başlayabilirsiniz (İyi bir donanımınız yoksa Önerilmez) 61 | * Kodları Colab üzerinden google 'ın makinelerinde çalıştırın : https://colab.research.google.com/drive/1vFtgVgfezjA3P3CqGEgFrWmOCCzyLyJY#scrollTo=TERQlyxB93D6&line=34&uniqifier=1 62 | -------------------------------------------------------------------------------- /GANs.py: -------------------------------------------------------------------------------- 1 | from tensorflow.python.keras.models import Sequential 2 | from tensorflow.python.keras.layers import Dense, Activation, Reshape 3 | from tensorflow.python.keras.layers import BatchNormalization 4 | from tensorflow.python.keras.layers import UpSampling2D, Conv2D 5 | from tensorflow.python.keras.layers import ELU 6 | from tensorflow.python.keras.layers import Flatten, Dropout 7 | from tensorflow.python.keras.optimizers import Adam 8 | from tensorflow.python.keras.datasets import mnist 9 | 10 | import os #klasör işlemi 11 | from PIL import Image #python resim kütüphanesi 12 | from helper import * #resim birleştirme fonksiyonu ve print işlemi 13 | 14 | 15 | def generator(input_dim=100, units=1024, activation='relu'): #üretici (resim), ilk paremetre gürültü, ikinci parametre ilk leyer daki nöron sayısı, 3. parametre aktivasyon fonksiyonu 16 | model = Sequential() #ardışık model 17 | model.add(Dense(input_dim=input_dim, units=units)) #Dense layer oluşturduk, 1.parametre verdiğimiz gürültü(rastgele sayı),2.parametre nöron sayısı 18 | model.add(BatchNormalization()) #normalleştirme yöntemi (performansımızı arttırır) 19 | model.add(Activation(activation)) # aktivasyon fonksiyonu 20 | model.add(Dense(128*7*7)) # layer içindeki nöron sayısı 21 | model.add(BatchNormalization()) 22 | model.add(Activation(activation)) 23 | model.add(Reshape((7, 7, 128), input_shape=(128*7*7,))) #convolutional sinir ağı girişi için tekrar düzenledik 24 | model.add(UpSampling2D((2, 2))) #matrisi 14x14x128 şeklinde düzenledik(derinlik etkilenmez) 25 | model.add(Conv2D(64, (5, 5), padding='same')) #conVent oluşturup filitre boyutu belirliyoruz (64 filite 5,5 boyutunda) boyutun küçülmesini engelleriz 26 | model.add(BatchNormalization()) 27 | model.add(Activation(activation)) 28 | model.add(UpSampling2D((2, 2))) 29 | model.add(Conv2D(1, (5, 5), padding='same')) #derinliği filtre etkiler 30 | model.add(Activation('tanh')) #aktivasyon fonksiyonu ([-1,1] aralığında değer döndürür bunlarla pixelleri renklendiririz) 31 | print(model.summary()) #model özeti. 32 | return model 33 | 34 | 35 | def discriminator(input_shape=(28, 28, 1), nb_filter=64): #kontrol edici fonksiyon, 1. parametre resmin boyutu (28,28,renkliyse 3 değilse 1), 2.parametre filtre 64 tane 36 | model = Sequential() #ardışık model oluşturduk, resmi alıp sinir ağının sonunda değer elde ederiz. 37 | model.add(Conv2D(nb_filter, (5, 5), strides=(2, 2), padding='same', input_shape=input_shape)) 38 | #convnet oluşturduk, 1.parametre filitre, 2. parametre boyutu, 3. parametre filitrelerin resimde nasıl kayacağı (2 pixel kayacak), 4. parametre boyutu korur resmin etrafına 0 lar ekler,5. parametre çıkış boyutu 39 | 40 | model.add(BatchNormalization()) #normalleştirme 41 | model.add(ELU()) #aktivasyon fonksiyonu (elu) 42 | model.add(Conv2D(2*nb_filter, (5, 5), strides=(2, 2))) #2 katı filitre ile yeni layer. boyut 5x5x128 e düşer 43 | model.add(BatchNormalization()) 44 | model.add(ELU()) 45 | model.add(Flatten()) #düzleştirme işlevi Dense layer eklemek için 46 | model.add(Dense(4*nb_filter)) # nöron sayısı 47 | model.add(BatchNormalization()) 48 | model.add(ELU()) 49 | model.add(Dropout(0.5)) # ezber yapmasını engeller. 50 | model.add(Dense(1)) # output sinir hücresi, çıkış 51 | model.add(Activation('sigmoid')) #aktivasyon fonksiyonu gelen değer [0,1] arasında 52 | print(model.summary()) #model özeti 53 | return model 54 | 55 | 56 | batch_size = 32 # eğitim esnasında tek dögü ile alacağımız resim sayısı 57 | num_epoch = 5 # tüm data setin eğitimden bir kez geçmesine denir 58 | learning_rate = 0.0002 #optimazsyon yaparken loss değerini düşürürüz 59 | image_path = 'images/' #klasöre resim oluşturma. 60 | 61 | if not os.path.exists(image_path): 62 | os.mkdir(image_path) #klasör oluşturma 63 | 64 | # gerçek resimlerin pixel değeri 0,1 arası 65 | # sahte resimler 0,255 arasında olacak, böylece ayrımı yapabileceğiz 66 | 67 | def train(): # eğitim 68 | (x_train, y_train), (_, _) = mnist.load_data() # 1. parametre test ve eğitim verisi, 2.parametre etiketler (G de ihtiyaç yok) 69 | # pixel ayarları (64,65 açıklama) 70 | x_train = (x_train.astype(np.float32) - 127.5) / 127.5 71 | x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1) 72 | 73 | g = generator() # çağırma işlemi 74 | d = discriminator() 75 | 76 | optimize = Adam(lr=learning_rate, beta_1=0.5) #optimizasyon algoritması belirleme. 77 | d.trainable = True # eğitilebilir olduğunu belirleriz 78 | d.compile(loss='binary_crossentropy', #loss fonksiyonu (performans ölçmek) 79 | metrics=['accuracy'], #isabet oranı 80 | optimizer=optimize) # eğitim gerçekleştirme 81 | 82 | d.trainable = False # eğitilmeyecek 83 | dcgan = Sequential([g, d]) #GANs oluşumu, D eğitilmeyecek 84 | dcgan.compile(loss='binary_crossentropy', 85 | metrics=['accuracy'], 86 | optimizer=optimize) 87 | 88 | num_batches = x_train.shape[0] // batch_size # resim sayısı / 1 dögüde girecek resim sayısı 89 | gen_img = np.array([np.random.uniform(-1, 1, 100) for _ in range(49)]) # rastgele gürültü oluşturma 90 | y_d_true = [1] * batch_size #grçekse etiket 1 91 | y_d_gen = [0] * batch_size # sahteyse etiket 0 92 | y_g = [1] * batch_size # g için etiket 93 | 94 | for epoch in range(num_epoch): 95 | 96 | for i in range(num_batches): #resimleri eğitiyoruz 97 | 98 | x_d_batch = x_train[i*batch_size:(i+1)*batch_size] # besleme için batch (32 resim) 99 | x_g = np.array([np.random.normal(0, 0.5, 100) for _ in range(batch_size)]) # G için gürültü oluşturma 100 | x_d_gen = g.predict(x_g) #resim üretme (32 adet) eğitim için 101 | 102 | d_loss = d.train_on_batch(x_d_batch, y_d_true) # D eğitimi (batc üzerinden,(gerçek_resim,sahte_resim)) 103 | d_loss = d.train_on_batch(x_d_gen, y_d_gen) #etiketleri 104 | 105 | g_loss = dcgan.train_on_batch(x_g, y_g) # G eğitimi dcgan üzerinden (input olarak gürültü veririz) 106 | show_progress(epoch, i, g_loss[0], d_loss[0], g_loss[1], d_loss[1]) # helper fonksiyonundaki bilgiler bölümü 107 | print("****",num_batches) 108 | 109 | image = combine_images(g.predict(gen_img)) #resimleri birleştirip tek resim yaptık 110 | image = image * 127.5 + 127.5 # değerleri 0,255 arasına genişlettik 111 | Image.fromarray(image.astype(np.uint8)).save(image_path + "%03d.png" % (epoch)) #resim kaydetme 112 | 113 | 114 | 115 | if __name__ == '__main__': 116 | train() #fonk çağırma 117 | --------------------------------------------------------------------------------