{"id":36348,"date":"2025-12-14T12:40:48","date_gmt":"2025-12-14T09:40:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36348"},"modified":"2025-12-14T12:40:48","modified_gmt":"2025-12-14T09:40:48","slug":"tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/","title":{"rendered":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek"},"content":{"rendered":"<p><body><\/p>\n<h2>TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Yapay zeka ve makine \u00f6\u011frenimi alan\u0131ndaki geli\u015fmeler, bilgisayarlar\u0131n sadece veriyi analiz etmekle kalmay\u0131p, ayn\u0131 zamanda yeni ve \u00f6zg\u00fcn veriler \u00fcretebilme yetene\u011fini de ortaya \u00e7\u0131karm\u0131\u015ft\u0131r. Bu yetene\u011fin en \u00e7arp\u0131c\u0131 \u00f6rneklerinden biri, Ian Goodfellow ve ekibi taraf\u0131ndan 2014 y\u0131l\u0131nda tan\u0131t\u0131lan \u00dcretken \u00c7eki\u015fmeli A\u011flar (Generative Adversarial Networks &#8211; GAN&#8217;lar) olmu\u015ftur. GAN&#8217;lar, \u00f6zellikle ger\u00e7ek\u00e7i g\u00f6r\u00fcnt\u00fcler, sesler veya metinler \u00fcretme konusunda devrim niteli\u011finde bir potansiyele sahiptir. Bu teknoloji, sentetik veri \u00fcretimi, g\u00f6r\u00fcnt\u00fcden g\u00f6r\u00fcnt\u00fcye \u00e7eviri, s\u00fcper \u00e7\u00f6z\u00fcn\u00fcrl\u00fck gibi bir\u00e7ok farkl\u0131 alanda \u00e7\u0131\u011f\u0131r a\u00e7m\u0131\u015ft\u0131r.<\/p>\n<p>Bir GAN, temelde birbiriyle rekabet eden iki sinir a\u011f\u0131ndan olu\u015fur: bir \u00dcretici (Generator) ve bir Ay\u0131rt Edici (Discriminator). Bu iki a\u011f, bir &#8220;kedi fare oyunu&#8221; benzeri bir senaryoda birlikte e\u011fitilir. \u00dcretici, ay\u0131rt ediciyi kand\u0131rmak amac\u0131yla ger\u00e7ek\u00e7i g\u00f6r\u00fcn\u00fcml\u00fc veri \u00f6rnekleri \u00fcretmeye \u00e7al\u0131\u015f\u0131rken, ay\u0131rt edici ise \u00fcretici taraf\u0131ndan olu\u015fturulan sahte verileri ger\u00e7ek verilerden ay\u0131rt etmeye \u00e7al\u0131\u015f\u0131r. Bu \u00e7eki\u015fmeli e\u011fitim s\u00fcreci, her iki a\u011f\u0131n da zamanla daha iyi performans g\u00f6stermesini sa\u011flar, ta ki \u00fcretici ay\u0131rt ediciyi kand\u0131rabilecek kadar ger\u00e7ek\u00e7i veriler \u00fcretebilir hale gelene kadar.<\/p>\n<p>Bu makalede, TensorFlow k\u00fct\u00fcphanesini kullanarak basit bir GAN modelini s\u0131f\u0131rdan nas\u0131l in\u015fa edece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, temel GAN mimarisini anlamak, TensorFlow&#8217;un Keras API&#8217;si ile model bile\u015fenlerini tan\u0131mlamak ve MNIST veri k\u00fcmesi \u00fczerinde say\u0131sal g\u00f6r\u00fcnt\u00fcler \u00fcretebilen bir GAN&#8217;\u0131 e\u011fitmek olacakt\u0131r. Bu s\u00fcre\u00e7 boyunca, GAN&#8217;lar\u0131n \u00e7al\u0131\u015fma prensiplerini, kay\u0131p fonksiyonlar\u0131n\u0131, optimizasyon stratejilerini ve e\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fc derinlemesine ele alaca\u011f\u0131z.<\/p>\n<h2>GAN&#8217;lar\u0131n Temel Yap\u0131s\u0131<\/h2>\n<p>Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN), ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, &#8220;\u00fcretken&#8221; ve &#8220;\u00e7eki\u015fmeli&#8221; olmak \u00fczere iki ana bile\u015fenden olu\u015fur. Bu bile\u015fenler, \u00f6zel bir e\u011fitim stratejisiyle bir araya gelerek birbiriyle rekabet eder.<\/p>\n<h3>\u00dcretici (Generator)<\/h3>\n<p>\u00dcretici a\u011f\u0131n temel g\u00f6revi, rastgele bir g\u00fcr\u00fclt\u00fc vekt\u00f6r\u00fcn\u00fc (genellikle latent space olarak adland\u0131r\u0131lan d\u00fc\u015f\u00fck boyutlu bir vekt\u00f6r) al\u0131p, hedef veri k\u00fcmesindeki \u00f6rnekleri taklit eden yeni veri \u00f6rnekleri \u00fcretmektir. \u00d6rne\u011fin, bir g\u00f6r\u00fcnt\u00fc GAN&#8217;\u0131nda, \u00fcretici rastgele bir say\u0131 dizisini alarak ger\u00e7ek\u00e7i bir g\u00f6r\u00fcnt\u00fc olu\u015fturmaya \u00e7al\u0131\u015f\u0131r. Bu a\u011f, genellikle bir dizi yo\u011fun (Dense) katman veya evri\u015fimli (Convolutional) katmanlardan olu\u015fur. G\u00f6r\u00fcnt\u00fc \u00fcretimi s\u00f6z konusu oldu\u011funda, \u00fcretici genellikle <code>Conv2DTranspose<\/code> (deconv) katmanlar\u0131n\u0131 kullanarak d\u00fc\u015f\u00fck boyutlu bir tens\u00f6r\u00fc kademeli olarak daha y\u00fcksek boyutlu bir g\u00f6r\u00fcnt\u00fcye d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<p>\u00dcreticinin \u00e7\u0131kt\u0131 katman\u0131, \u00fcretilen verinin t\u00fcr\u00fcne ba\u011fl\u0131 olarak farkl\u0131 aktivasyon fonksiyonlar\u0131 kullanabilir. G\u00f6r\u00fcnt\u00fcler i\u00e7in genellikle <code>tanh<\/code> aktivasyon fonksiyonu tercih edilir, \u00e7\u00fcnk\u00fc bu fonksiyon \u00e7\u0131kt\u0131 de\u011ferlerini -1 ile 1 aras\u0131na s\u0131k\u0131\u015ft\u0131r\u0131r, bu da genellikle g\u00f6r\u00fcnt\u00fc piksellerinin normalize edilmi\u015f aral\u0131\u011f\u0131na uygundur. Ara katmanlarda ise <code>LeakyReLU<\/code> veya <code>ReLU<\/code> gibi aktivasyon fonksiyonlar\u0131 kullan\u0131l\u0131r. \u00dcreticinin amac\u0131, ay\u0131rt ediciyi kand\u0131racak kadar inand\u0131r\u0131c\u0131 sahte veriler \u00fcretmektir.<\/p>\n<h3>Ay\u0131rt Edici (Discriminator)<\/h3>\n<p>Ay\u0131rt edici a\u011f\u0131n g\u00f6revi, kendisine sunulan bir veri \u00f6rne\u011finin ger\u00e7ek mi yoksa \u00fcretici taraf\u0131ndan \u00fcretilmi\u015f sahte bir \u00f6rnek mi oldu\u011funu ay\u0131rt etmektir. Bu, ikili bir s\u0131n\u0131fland\u0131rma problemidir. Ay\u0131rt edici, bir veri \u00f6rne\u011fini girdi olarak al\u0131r ve bu \u00f6rne\u011fin ger\u00e7ek olma olas\u0131l\u0131\u011f\u0131n\u0131 temsil eden tek bir skaler de\u011fer (genellikle 0 ile 1 aras\u0131nda) d\u00f6nd\u00fcr\u00fcr. 1&#8217;e yak\u0131n de\u011ferler \u00f6rne\u011fin ger\u00e7ek oldu\u011funa, 0&#8217;a yak\u0131n de\u011ferler ise sahte oldu\u011funa i\u015faret eder.<\/p>\n<p>Ay\u0131rt edici, genellikle hedef veri k\u00fcmesinin \u00f6zelliklerini \u00e7\u0131karabilen bir dizi evri\u015fimli (Conv2D) katmandan veya yo\u011fun (Dense) katmandan olu\u015fur. G\u00f6r\u00fcnt\u00fcler i\u00e7in <code>Conv2D<\/code> katmanlar\u0131, g\u00f6r\u00fcnt\u00fcdeki \u00f6zellikleri \u00f6\u011frenmek i\u00e7in kullan\u0131l\u0131r. \u00c7\u0131k\u0131\u015f katman\u0131, ikili s\u0131n\u0131fland\u0131rma i\u00e7in <code>sigmoid<\/code> aktivasyon fonksiyonunu kullan\u0131r. Ara katmanlarda <code>LeakyReLU<\/code> gibi aktivasyon fonksiyonlar\u0131 yayg\u0131n olarak kullan\u0131l\u0131r ve genellikle <code>Dropout<\/code> katmanlar\u0131, a\u015f\u0131r\u0131 \u00f6\u011frenmeyi (overfitting) \u00f6nlemek i\u00e7in eklenir. Ay\u0131rt edicinin amac\u0131, \u00fcreticinin \u00fcretti\u011fi sahte verileri m\u00fcmk\u00fcn oldu\u011funca do\u011fru bir \u015fekilde tespit etmektir.<\/p>\n<h3>\u00c7eki\u015fmeli S\u00fcre\u00e7 (Adversarial Process)<\/h3>\n<p>GAN&#8217;lar\u0131n g\u00fcc\u00fc, \u00fcretici ve ay\u0131rt edici aras\u0131ndaki \u00e7eki\u015fmeli e\u011fitim s\u00fcrecinden gelir. Bu s\u00fcre\u00e7, bir oyun teorisi senaryosuna benzetilebilir:<\/p>\n<p>1.  <strong>\u00dcretici E\u011fitimi<\/strong>: \u00dcretici, rastgele g\u00fcr\u00fclt\u00fcden sahte veriler \u00fcretir. Bu sahte veriler, ay\u0131rt ediciye sunulur. \u00dcreticinin amac\u0131, ay\u0131rt edicinin bu sahte verileri &#8220;ger\u00e7ek&#8221; olarak s\u0131n\u0131fland\u0131rmas\u0131n\u0131 sa\u011flamakt\u0131r. \u00dcretici, ay\u0131rt edicinin kendi sahte \u00e7\u0131kt\u0131lar\u0131na verdi\u011fi d\u00fc\u015f\u00fck &#8220;ger\u00e7ek&#8221; puanlar\u0131n\u0131 y\u00fckseltmek i\u00e7in a\u011f\u0131rl\u0131klar\u0131n\u0131 g\u00fcnceller.<br \/>\n2.  <strong>Ay\u0131rt Edici E\u011fitimi<\/strong>: Ay\u0131rt ediciye hem ger\u00e7ek veri k\u00fcmesinden \u00f6rnekler hem de \u00fcretici taraf\u0131ndan \u00fcretilen sahte \u00f6rnekler sunulur. Ay\u0131rt edicinin amac\u0131, ger\u00e7ek \u00f6rnekleri &#8220;ger\u00e7ek&#8221; (1) olarak, sahte \u00f6rnekleri ise &#8220;sahte&#8221; (0) olarak do\u011fru bir \u015fekilde s\u0131n\u0131fland\u0131rmakt\u0131r. Ay\u0131rt edici, bu s\u0131n\u0131fland\u0131rma hatas\u0131n\u0131 minimize etmek i\u00e7in a\u011f\u0131rl\u0131klar\u0131n\u0131 g\u00fcnceller.<\/p>\n<p>Bu iki a\u015fama, bir e\u011fitim d\u00f6ng\u00fcs\u00fc i\u00e7inde ard\u0131\u015f\u0131k olarak tekrarlan\u0131r. Her d\u00f6ng\u00fcde, \u00fcretici sahte verileri daha inand\u0131r\u0131c\u0131 hale getirmeye \u00e7al\u0131\u015f\u0131rken, ay\u0131rt edici de bu sahtelikleri tespit etmede daha yetenekli hale gelir. Bu s\u00fcre\u00e7, bir denge noktas\u0131na ula\u015fana kadar devam eder. \u0130deal denge noktas\u0131nda, \u00fcretici o kadar ger\u00e7ek\u00e7i veriler \u00fcretebilir ki, ay\u0131rt edici art\u0131k ger\u00e7ek ve sahte veriler aras\u0131nda rastgele tahmin yapmaktan daha iyi performans g\u00f6steremez (yani %50 do\u011fruluk oran\u0131na ula\u015f\u0131r). Bu durum, Nash dengesi olarak bilinir.<\/p>\n<h2>TensorFlow ile GAN Uygulamas\u0131<\/h2>\n<p>\u015eimdi, TensorFlow ve Keras API&#8217;sini kullanarak basit bir GAN modelini nas\u0131l in\u015fa edece\u011fimizi ad\u0131m ad\u0131m inceleyelim. MNIST veri k\u00fcmesini kullanarak el yaz\u0131s\u0131 rakamlar \u00fcretece\u011fiz.<\/p>\n<h3>Geli\u015ftirme Ortam\u0131 ve K\u00fct\u00fcphaneler<\/h3>\n<p>Bu uygulama i\u00e7in Python, TensorFlow, Keras API&#8217;si, NumPy ve Matplotlib k\u00fct\u00fcphanelerine ihtiyac\u0131m\u0131z olacak.<\/p>\n<pre><code class=\"language-python\">import tensorflow as tf\nfrom tensorflow.keras import layers\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport time<\/code><\/pre>\n<h3>Veri K\u00fcmesi<\/h3>\n<p>MNIST veri k\u00fcmesi, 28&#215;28 piksellik gri tonlamal\u0131 el yaz\u0131s\u0131 rakam g\u00f6r\u00fcnt\u00fclerinden olu\u015fur. Basit yap\u0131s\u0131 nedeniyle GAN&#8217;lar\u0131 \u00f6\u011frenmek i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\"># MNIST veri k\u00fcmesini y\u00fckle ve haz\u0131rla\n(train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()\n\n<h2>G\u00f6r\u00fcnt\u00fcleri -1 ile 1 aras\u0131na normalize et<\/h2>\n<h2>\u00dcreticinin tanh aktivasyonunu kullanmas\u0131 i\u00e7in bu aral\u0131k daha uygun<\/h2>\ntrain_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')\ntrain_images = (train_images - 127.5) \/ 127.5 # Normalizasyon [-1, 1] aral\u0131\u011f\u0131na\n\n<h2>Veri k\u00fcmesini kar\u0131\u015ft\u0131r ve batch'lere ay\u0131r<\/h2>\nBUFFER_SIZE = 60000\nBATCH_SIZE = 256\ntrain_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)<\/code><\/pre>\n<p>Burada, MNIST g\u00f6r\u00fcnt\u00fclerini y\u00fckleyip yeniden \u015fekillendiriyoruz (60000, 28, 28, 1) ve piksel de\u011ferlerini 0-255 aral\u0131\u011f\u0131ndan -1 ile 1 aral\u0131\u011f\u0131na normalize ediyoruz. Bu normalizasyon, \u00fcreticinin \u00e7\u0131kt\u0131 katman\u0131ndaki <code>tanh<\/code> aktivasyon fonksiyonuyla uyumlu \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>\u00dcretici Modeli Olu\u015fturma<\/h3>\n<p>\u00dcretici, rastgele g\u00fcr\u00fclt\u00fc vekt\u00f6r\u00fcn\u00fc (latent vector) girdi olarak alacak ve 28x28x1 boyutunda bir g\u00f6r\u00fcnt\u00fc \u00fcretecektir.<\/p>\n<pre><code class=\"language-python\">def make_generator_model():\n    model = tf.keras.Sequential()\n    # Ba\u015flang\u0131\u00e7ta latent_dim boyutunda bir vekt\u00f6r\u00fc al\u0131p,\n    # bir Dense katman\u0131yla daha b\u00fcy\u00fck bir vekt\u00f6re d\u00f6n\u00fc\u015ft\u00fcr\n    # 7x7x256'l\u0131k bir tens\u00f6r haline getirilecek\n    model.add(layers.Dense(7<em>7<\/em>256, use_bias=False, input_shape=(100,)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    # Tens\u00f6r\u00fc (batch_size, 7, 7, 256) \u015feklinde yeniden \u015fekillendir\n    model.add(layers.Reshape((7, 7, 256)))\n    assert model.output_shape == (None, 7, 7, 256) # Not: None, batch boyutunu temsil eder\n\n    # \u0130lk Conv2DTranspose katman\u0131: 7x7 -> 14x14\n    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))\n    assert model.output_shape == (None, 7, 7, 128)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    # \u0130kinci Conv2DTranspose katman\u0131: 14x14 -> 14x14\n    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    assert model.output_shape == (None, 14, 14, 64)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    # \u00dc\u00e7\u00fcnc\u00fc Conv2DTranspose katman\u0131: 14x14 -> 28x28\n    # \u00c7\u0131k\u0131\u015f katman\u0131, g\u00f6r\u00fcnt\u00fc piksellerini -1 ile 1 aras\u0131na s\u0131k\u0131\u015ft\u0131rmak i\u00e7in tanh kullan\u0131r\n    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))\n    assert model.output_shape == (None, 28, 28, 1)\n\n    return model<\/code><\/pre>\n<p>\u00dcretici modelimiz, 100 boyutlu bir g\u00fcr\u00fclt\u00fc vekt\u00f6r\u00fcn\u00fc al\u0131r. \u0130lk <code>Dense<\/code> katman\u0131yla bu vekt\u00f6r\u00fc b\u00fcy\u00fct\u00fcr ve <code>Reshape<\/code> katman\u0131yla 7x7x256 boyutunda bir tens\u00f6re d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Ard\u0131ndan, <code>Conv2DTranspose<\/code> (ters evri\u015fim veya dekonvol\u00fcsyon olarak da bilinir) katmanlar\u0131 kullanarak bu tens\u00f6r\u00fc kademeli olarak 28x28x1 boyutunda bir g\u00f6r\u00fcnt\u00fcye y\u00fckseltir. <code>BatchNormalization<\/code> katmanlar\u0131 e\u011fitimi stabilize etmeye yard\u0131mc\u0131 olur ve <code>LeakyReLU<\/code> aktivasyonlar\u0131 gradyan ak\u0131\u015f\u0131n\u0131 sa\u011flar. Son katmanda <code>tanh<\/code> aktivasyonu, piksel de\u011ferlerinin -1 ile 1 aral\u0131\u011f\u0131nda olmas\u0131n\u0131 garanti eder.<\/p>\n<h3>Ay\u0131rt Edici Modeli Olu\u015fturma<\/h3>\n<p>Ay\u0131rt edici, 28x28x1 boyutunda bir g\u00f6r\u00fcnt\u00fcy\u00fc girdi olarak alacak ve bu g\u00f6r\u00fcnt\u00fcn\u00fcn ger\u00e7ek olma olas\u0131l\u0131\u011f\u0131n\u0131 tahmin eden tek bir skaler de\u011fer (0 ile 1 aras\u0131) d\u00f6nd\u00fcrecektir.<\/p>\n<pre><code class=\"language-python\">def make_discriminator_model():\n    model = tf.keras.Sequential()\n    # \u0130lk Conv2D katman\u0131\n    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',\n                                     input_shape=[28, 28, 1]))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.3))\n\n    # \u0130kinci Conv2D katman\u0131\n    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.3))\n\n    # D\u00fczle\u015ftirme (Flatten) ve Dense katman\u0131\n    model.add(layers.Flatten())\n    model.add(layers.Dense(1, activation='sigmoid')) # \u0130kili s\u0131n\u0131fland\u0131rma i\u00e7in sigmoid\n\n    return model<\/code><\/pre>\n<p>Ay\u0131rt edici modelimiz, 28x28x1 boyutunda bir g\u00f6r\u00fcnt\u00fcy\u00fc al\u0131r. <code>Conv2D<\/code> katmanlar\u0131, g\u00f6r\u00fcnt\u00fcden \u00f6zellikler \u00e7\u0131karmak i\u00e7in kullan\u0131l\u0131r. <code>strides=(2,2)<\/code> parametresi, mekansal boyutlar\u0131 k\u00fc\u00e7\u00fclterek bilgiyi yo\u011funla\u015ft\u0131r\u0131r. <code>LeakyReLU<\/code> aktivasyonlar\u0131 gradyan ak\u0131\u015f\u0131n\u0131 desteklerken, <code>Dropout<\/code> katmanlar\u0131 a\u015f\u0131r\u0131 \u00f6\u011frenmeyi \u00f6nler. Son olarak, <code>Flatten<\/code> katman\u0131 evri\u015fimli \u00e7\u0131kt\u0131lar\u0131 tek bir vekt\u00f6re d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve <code>Dense(1, activation='sigmoid')<\/code> katman\u0131 g\u00f6r\u00fcnt\u00fcn\u00fcn ger\u00e7ek olma olas\u0131l\u0131\u011f\u0131n\u0131 tahmin eder.<\/p>\n<h3>Kay\u0131p Fonksiyonlar\u0131 ve Optimizat\u00f6rler<\/h3>\n<p>GAN&#8217;lar i\u00e7in \u00f6zel kay\u0131p fonksiyonlar\u0131na ve ayr\u0131 optimizat\u00f6rlere ihtiyac\u0131m\u0131z var.<\/p>\n<p><strong>Kay\u0131p Fonksiyonlar\u0131:<\/strong><br \/>\n*   <strong>Ay\u0131rt Edici Kayb\u0131 (Discriminator Loss)<\/strong>: Ay\u0131rt edicinin ger\u00e7ek g\u00f6r\u00fcnt\u00fcleri ger\u00e7ek olarak, sahte g\u00f6r\u00fcnt\u00fcleri sahte olarak do\u011fru bir \u015fekilde s\u0131n\u0131fland\u0131rma yetene\u011fini \u00f6l\u00e7er. <code>BinaryCrossentropy<\/code> kullan\u0131l\u0131r.<br \/>\n*   <strong>\u00dcretici Kayb\u0131 (Generator Loss)<\/strong>: \u00dcreticinin ay\u0131rt ediciyi sahte g\u00f6r\u00fcnt\u00fcleri ger\u00e7ek olarak s\u0131n\u0131fland\u0131rmaya ikna etme yetene\u011fini \u00f6l\u00e7er. Yine <code>BinaryCrossentropy<\/code> kullan\u0131l\u0131r, ancak burada \u00fcreticinin \u00fcretti\u011fi t\u00fcm g\u00f6r\u00fcnt\u00fcler i\u00e7in ay\u0131rt edicinin &#8220;ger\u00e7ek&#8221; (1) olarak s\u0131n\u0131fland\u0131rmas\u0131n\u0131 bekleriz.<\/p>\n<pre><code class=\"language-python\"># \u0130kili \u00e7apraz entropi kay\u0131p fonksiyonu\ncross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=False) # Sigmoid kullan\u0131ld\u0131\u011f\u0131 i\u00e7in from_logits=False\n\ndef discriminator_loss(real_output, fake_output):\n    real_loss = cross_entropy(tf.ones_like(real_output), real_output) # Ger\u00e7ek g\u00f6r\u00fcnt\u00fcler i\u00e7in hedef 1\n    fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output) # Sahte g\u00f6r\u00fcnt\u00fcler i\u00e7in hedef 0\n    total_loss = real_loss + fake_loss\n    return total_loss\n\ndef generator_loss(fake_output):\n    # \u00dcreticinin amac\u0131, ay\u0131rt edicinin sahte g\u00f6r\u00fcnt\u00fcleri ger\u00e7ek (1) olarak s\u0131n\u0131fland\u0131rmas\u0131n\u0131 sa\u011flamakt\u0131r.\n    return cross_entropy(tf.ones_like(fake_output), fake_output)<\/code><\/pre>\n<p><code>from_logits=False<\/code> parametresi, model \u00e7\u0131kt\u0131s\u0131n\u0131n zaten bir olas\u0131l\u0131k de\u011feri (sigmoid aktivasyonu sonras\u0131) oldu\u011funu belirtir. E\u011fer \u00e7\u0131kt\u0131 katman\u0131nda sigmoid aktivasyonu kullanmasayd\u0131k (<code>from_logits=True<\/code> olurdu), kay\u0131p fonksiyonu kendi i\u00e7inde sigmoid uygulard\u0131.<\/p>\n<p><strong>Optimizat\u00f6rler:<\/strong><br \/>\n\u00dcretici ve ay\u0131rt ediciyi ayr\u0131 ayr\u0131 e\u011fitmek i\u00e7in iki ayr\u0131 optimizat\u00f6re ihtiyac\u0131m\u0131z var. <code>Adam<\/code> optimizat\u00f6r\u00fc yayg\u0131n olarak kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">generator_optimizer = tf.keras.optimizers.Adam(1e-4) # \u00d6\u011frenme oran\u0131 0.0001\ndiscriminator_optimizer = tf.keras.optimizers.Adam(1e-4) # \u00d6\u011frenme oran\u0131 0.0001<\/code><\/pre>\n<h3>E\u011fitim D\u00f6ng\u00fcs\u00fc<\/h3>\n<p>E\u011fitim d\u00f6ng\u00fcs\u00fc, her ad\u0131mda hem ay\u0131rt ediciyi hem de \u00fcreticiyi e\u011fitmeyi i\u00e7erir. <code>tf.GradientTape<\/code> API&#8217;si, otomatik farkl\u0131la\u015fma i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">EPOCHS = 50\nnoise_dim = 100\nnum_examples_to_generate = 16\n\n<h2>Her e\u011fitim ad\u0131m\u0131nda ayn\u0131 g\u00fcr\u00fclt\u00fc vekt\u00f6r\u00fcn\u00fc kullanaca\u011f\u0131z<\/h2>\n<h2>Bu, \u00fcreticinin e\u011fitim s\u00fcresince ilerlemesini g\u00f6rselle\u015ftirmemizi sa\u011flar.<\/h2>\nseed = tf.random.normal([num_examples_to_generate, noise_dim])\n\n<h2>Tek bir e\u011fitim ad\u0131m\u0131n\u0131 tan\u0131mla<\/h2>\n@tf.function # Performans i\u00e7in tf.function kullan\u0131r\u0131z\ndef train_step(images):\n    # \u00dcretici i\u00e7in rastgele g\u00fcr\u00fclt\u00fc olu\u015ftur\n    noise = tf.random.normal([BATCH_SIZE, noise_dim])\n\n    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n        # \u00dcretici sahte g\u00f6r\u00fcnt\u00fcler \u00fcretir\n        generated_images = generator(noise, training=True)\n\n        # Ay\u0131rt edici hem ger\u00e7ek hem de sahte g\u00f6r\u00fcnt\u00fcler \u00fczerinde tahmin yapar\n        real_output = discriminator(images, training=True)\n        fake_output = discriminator(generated_images, training=True)\n\n        # Kay\u0131p fonksiyonlar\u0131n\u0131 hesapla\n        gen_loss = generator_loss(fake_output)\n        disc_loss = discriminator_loss(real_output, fake_output)\n\n    # Gradyanlar\u0131 hesapla\n    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n\n    # Gradyanlar\u0131 uygula (a\u011f\u0131rl\u0131klar\u0131 g\u00fcncelle)\n    generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))\n\n<h2>E\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fc tan\u0131mla<\/h2>\ndef train(dataset, epochs):\n    for epoch in range(epochs):\n        start = time.time()\n\n        for image_batch in dataset:\n            train_step(image_batch)\n\n        # Her 15 epoch'ta bir veya belirli aral\u0131klarla \u00fcretilen g\u00f6r\u00fcnt\u00fcleri kaydet\n        if (epoch + 1) % 15 == 0:\n            generate_and_save_images(generator,\n                                     epoch + 1,\n                                     seed)\n\n        print (f'Epoch {epoch + 1} bitti, ge\u00e7en s\u00fcre: {time.time()-start:.2f} saniye')\n\n    # Son epoch'tan sonra g\u00f6r\u00fcnt\u00fcleri olu\u015ftur ve kaydet\n    generate_and_save_images(generator,\n                             epochs,\n                             seed)\n\n<h2>G\u00f6r\u00fcnt\u00fcleri olu\u015fturma ve kaydetme fonksiyonu<\/h2>\ndef generate_and_save_images(model, epoch, test_input):\n    predictions = model(test_input, training=False)\n\n    fig = plt.figure(figsize=(4, 4))\n\n    for i in range(predictions.shape[0]):\n        plt.subplot(4, 4, i+1)\n        # G\u00f6r\u00fcnt\u00fcleri [0, 1] aral\u0131\u011f\u0131na geri d\u00f6n\u00fc\u015ft\u00fcr ve g\u00f6ster\n        plt.imshow((predictions[i, :, :, 0] * 0.5 + 0.5), cmap='gray')\n        plt.axis('off')\n\n    plt.savefig(f'image_at_epoch_{epoch:04d}.png')\n    plt.show()<\/code><\/pre>\n<p><code>train_step<\/code> fonksiyonu, GAN e\u011fitiminin kalbidir. Bir batch g\u00f6r\u00fcnt\u00fcy\u00fc al\u0131r ve \u015fu ad\u0131mlar\u0131 uygular:<br \/>\n1.  Rastgele g\u00fcr\u00fclt\u00fc olu\u015fturur.<br \/>\n2.  \u00dcretici bu g\u00fcr\u00fclt\u00fcden sahte g\u00f6r\u00fcnt\u00fcler \u00fcretir.<br \/>\n3.  Ay\u0131rt edici, hem ger\u00e7ek g\u00f6r\u00fcnt\u00fcler hem de \u00fcretilen sahte g\u00f6r\u00fcnt\u00fcler \u00fczerinde tahminler yapar.<br \/>\n4.  \u00dcretici ve ay\u0131rt edici i\u00e7in kay\u0131p fonksiyonlar\u0131 hesaplan\u0131r.<br \/>\n5.  <code>tf.GradientTape<\/code> kullan\u0131larak her iki a\u011f\u0131n da a\u011f\u0131rl\u0131klar\u0131na g\u00f6re gradyanlar hesaplan\u0131r.<br \/>\n6.  <code>Adam<\/code> optimizat\u00f6rleri, hesaplanan gradyanlar\u0131 kullanarak a\u011flar\u0131n a\u011f\u0131rl\u0131klar\u0131n\u0131 g\u00fcnceller.<\/p>\n<p><code>train<\/code> fonksiyonu, veri k\u00fcmesi \u00fczerinde belirli bir say\u0131da epoch boyunca <code>train_step<\/code>&#8216;i \u00e7a\u011f\u0131r\u0131r ve belirli aral\u0131klarla \u00fcretilen g\u00f6r\u00fcnt\u00fcleri kaydeder.<\/p>\n<h3>Model Olu\u015fturma ve E\u011fitme<\/h3>\n<p>Son olarak, model \u00f6rneklerini olu\u015fturup e\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fc ba\u015flatabiliriz.<\/p>\n<pre><code class=\"language-python\"># Modelleri olu\u015ftur\ngenerator = make_generator_model()\ndiscriminator = make_discriminator_model()\n\n<h2>E\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fc ba\u015flat<\/h2>\ntrain(train_dataset, EPOCHS)<\/code><\/pre>\n<h2>Kod \u00d6rne\u011fi<\/h2>\n<p>Yukar\u0131daki par\u00e7alar\u0131 bir araya getiren tam kod \u00f6rne\u011fi a\u015fa\u011f\u0131dad\u0131r. Bu kodu \u00e7al\u0131\u015ft\u0131rarak kendi basit GAN&#8217;\u0131n\u0131z\u0131 e\u011fitebilirsiniz.<\/p>\n<pre><code class=\"language-python\">import tensorflow as tf\nfrom tensorflow.keras import layers\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport time\n\n<h2>Gerekli dizinleri olu\u015ftur<\/h2>\nif not os.path.exists('generated_images'):\n    os.makedirs('generated_images')\n\n<h2>Veri k\u00fcmesini y\u00fckle ve haz\u0131rla<\/h2>\n(train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()\ntrain_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')\ntrain_images = (train_images - 127.5) \/ 127.5 # Normalizasyon [-1, 1] aral\u0131\u011f\u0131na\n\nBUFFER_SIZE = 60000\nBATCH_SIZE = 256\ntrain_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)\n\n<h2>\u00dcretici modelini tan\u0131mla<\/h2>\ndef make_generator_model():\n    model = tf.keras.Sequential()\n    model.add(layers.Dense(7<em>7<\/em>256, use_bias=False, input_shape=(100,)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Reshape((7, 7, 256)))\n\n    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))\n\n    return model\n\n<h2>Ay\u0131rt edici modelini tan\u0131mla<\/h2>\ndef make_discriminator_model():\n    model = tf.keras.Sequential()\n    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',\n                                     input_shape=[28, 28, 1]))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.3))\n\n    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.3))\n\n    model.add(layers.Flatten())\n    model.add(layers.Dense(1, activation='sigmoid'))\n\n    return model\n\n<h2>Kay\u0131p fonksiyonlar\u0131n\u0131 tan\u0131mla<\/h2>\ncross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=False)\n\ndef discriminator_loss(real_output, fake_output):\n    real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n    fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)\n    total_loss = real_loss + fake_loss\n    return total_loss\n\ndef generator_loss(fake_output):\n    return cross_entropy(tf.ones_like(fake_output), fake_output)\n\n<h2>Optimizat\u00f6rleri tan\u0131mla<\/h2>\ngenerator_optimizer = tf.keras.optimizers.Adam(1e-4)\ndiscriminator_optimizer = tf.keras.optimizers.Adam(1e-4)\n\n<h2>E\u011fitim parametreleri<\/h2>\nEPOCHS = 50\nnoise_dim = 100\nnum_examples_to_generate = 16\n\nseed = tf.random.normal([num_examples_to_generate, noise_dim])\n\n<h2>Tek bir e\u011fitim ad\u0131m\u0131n\u0131 tan\u0131mla<\/h2>\n@tf.function\ndef train_step(images):\n    noise = tf.random.normal([BATCH_SIZE, noise_dim])\n\n    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n        generated_images = generator(noise, training=True)\n\n        real_output = discriminator(images, training=True)\n        fake_output = discriminator(generated_images, training=True)\n\n        gen_loss = generator_loss(fake_output)\n        disc_loss = discriminator_loss(real_output, fake_output)\n\n    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n\n    generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))\n\n<h2>G\u00f6r\u00fcnt\u00fcleri olu\u015fturma ve kaydetme fonksiyonu<\/h2>\ndef generate_and_save_images(model, epoch, test_input):\n    predictions = model(test_input, training=False)\n\n    fig = plt.figure(figsize=(4, 4))\n\n    for i in range(predictions.shape[0]):\n        plt.subplot(4, 4, i+1)\n        plt.imshow((predictions[i, :, :, 0] * 0.5 + 0.5), cmap='gray')\n        plt.axis('off')\n\n    plt.savefig(os.path.join('generated_images', f'image_at_epoch_{epoch:04d}.png'))\n    plt.close(fig) # Fig\u00fcr\u00fc kapat, bellek kullan\u0131m\u0131n\u0131 azalt\n\n<h2>E\u011fitim d\u00f6ng\u00fcs\u00fcn\u00fc tan\u0131mla<\/h2>\ndef train(dataset, epochs):\n    for epoch in range(epochs):\n        start = time.time()\n\n        for image_batch in dataset:\n            train_step(image_batch)\n\n        if (epoch + 1) % 5 == 0: # Her 5 epoch'ta bir g\u00f6r\u00fcnt\u00fc kaydet\n            generate_and_save_images(generator,\n                                     epoch + 1,\n                                     seed)\n\n        print (f'Epoch {epoch + 1} bitti, ge\u00e7en s\u00fcre: {time.time()-start:.2f} saniye')\n\n    generate_and_save_images(generator,\n                             epochs,\n                             seed)\n\n<h2>Modelleri olu\u015ftur<\/h2>\ngenerator = make_generator_model()\ndiscriminator = make_discriminator_model()\n\n<h2>E\u011fitimi ba\u015flat<\/h2>\nprint(\"GAN e\u011fitimi ba\u015fl\u0131yor...\")\ntrain(train_dataset, EPOCHS)\nprint(\"GAN e\u011fitimi tamamland\u0131.\")\n\n<h2>Sonu\u00e7lar\u0131 g\u00f6rselle\u015ftir (iste\u011fe ba\u011fl\u0131)<\/h2>\n<h2>generate_and_save_images fonksiyonu zaten kaydeder, bu k\u0131s\u0131m sadece g\u00f6sterim i\u00e7indir<\/h2>\n<h2>son_epoch_resim_yolu = os.path.join('generated_images', f'image_at_epoch_{EPOCHS:04d}.png')<\/h2>\n<h2>if os.path.exists(son_epoch_resim_yolu):<\/h2>\n<h2>img = plt.imread(son_epoch_resim_yolu)<\/h2>\n<h2>plt.imshow(img)<\/h2>\n<h2>plt.axis('off')<\/h2>\n<h2>plt.title(f'Epoch {EPOCHS} Sonras\u0131 \u00dcretilen G\u00f6r\u00fcnt\u00fcler')<\/h2>\n<h2>plt.show()<\/code><\/pre>\n<\/h2>\n<h2>De\u011ferlendirme ve \u0130yile\u015ftirmeler<\/h2>\n<p>Basit bir GAN modeli in\u015fa etmek, temel prensipleri anlamak i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Ancak, GAN&#8217;lar\u0131n e\u011fitimi zorlu bir s\u00fcre\u00e7 olabilir ve kar\u015f\u0131la\u015f\u0131labilecek baz\u0131 yayg\u0131n sorunlar vard\u0131r:<\/p>\n<p>1.  <strong>Mod \u00c7\u00f6kmesi (Mode Collapse)<\/strong>: \u00dcretici, t\u00fcm veri da\u011f\u0131l\u0131m\u0131n\u0131 \u00f6\u011frenmek yerine, ay\u0131rt ediciyi kand\u0131rmak i\u00e7in sadece birka\u00e7 t\u00fcr veri \u00f6rne\u011fi \u00fcretmeyi \u00f6\u011frenebilir. \u00d6rne\u011fin, MNIST&#8217;te sadece &#8220;1&#8221; rakam\u0131n\u0131 \u00fcretmeye odaklanabilir. Bu, \u00fcreticinin \u00e7e\u015fitlilikten yoksun kalmas\u0131na neden olur.<br \/>\n2.  <strong>E\u011fitim Karars\u0131zl\u0131\u011f\u0131<\/strong>: \u00dcretici ve ay\u0131rt edici aras\u0131ndaki dengeyi korumak zordur. Bir a\u011f di\u011ferine g\u00f6re \u00e7ok daha h\u0131zl\u0131 \u00f6\u011frenebilir, bu da e\u011fitimin durmas\u0131na veya anlams\u0131z \u00e7\u0131kt\u0131lar \u00fcretilmesine yol a\u00e7abilir. Gradyanlar kaybolabilir veya patlayabilir.<br \/>\n3.  <strong>Metrik Eksikli\u011fi<\/strong>: GAN&#8217;lar\u0131n performans\u0131n\u0131 \u00f6l\u00e7mek i\u00e7in net ve objektif bir metrik yoktur. Kay\u0131p de\u011ferleri genellikle yan\u0131lt\u0131c\u0131 olabilir; d\u00fc\u015f\u00fck kay\u0131p her zaman iyi \u00fcretim anlam\u0131na gelmez. FID (Frechet Inception Distance) veya Inception Score gibi metrikler daha geli\u015fmi\u015f GAN&#8217;lar i\u00e7in kullan\u0131l\u0131r, ancak bu basit \u00f6rnekte g\u00f6rsel de\u011ferlendirme daha yayg\u0131nd\u0131r.<\/p>\n<p>Bu sorunlar\u0131 gidermek ve daha iyi performans elde etmek i\u00e7in \u00e7e\u015fitli iyile\u015ftirmeler ve varyasyonlar geli\u015ftirilmi\u015ftir:<\/p>\n<p>*   <strong>Derin Evri\u015fimli GAN&#8217;lar (DCGAN)<\/strong>: Evri\u015fimli katmanlar\u0131n kullan\u0131m\u0131, g\u00f6r\u00fcnt\u00fc \u00fcretimi i\u00e7in daha kararl\u0131 ve y\u00fcksek kaliteli sonu\u00e7lar sa\u011flar. Yukar\u0131daki \u00f6rne\u011fimizde DCGAN mimarisine benzer katmanlar kulland\u0131k.<br \/>\n*   <strong>Wasserstein GAN (WGAN)<\/strong>: Geleneksel \u00e7apraz entropi kayb\u0131 yerine Wasserstein mesafesini kullanan WGAN&#8217;lar, daha kararl\u0131 bir e\u011fitime ve mod \u00e7\u00f6kmesine kar\u015f\u0131 daha iyi dirence sahiptir. Ayr\u0131ca, kay\u0131p fonksiyonu, \u00fcreticinin e\u011fitiminin ne kadar iyi gitti\u011fi hakk\u0131nda daha anlaml\u0131 bilgi sa\u011flar.<br \/>\n*   <strong>Ko\u015fullu GAN (cGAN)<\/strong>: \u00dcreticiye sadece rastgele g\u00fcr\u00fclt\u00fc de\u011fil, ayn\u0131 zamanda ko\u015fullu bilgi (\u00f6rne\u011fin, \u00fcretilecek rakam\u0131n etiketi) sa\u011flayarak belirli \u00f6zelliklere sahip veriler \u00fcretilmesini sa\u011flar.<br \/>\n*   <strong>Spektral Normalizasyon (SN-GAN)<\/strong>: Ay\u0131rt ediciye spektral normalizasyon uygulayarak e\u011fitimin kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Tek Tarafl\u0131 Etiket D\u00fczeltme (One-sided Label Smoothing)<\/strong>: Ay\u0131rt edicinin a\u015f\u0131r\u0131 g\u00fcvenli olmas\u0131n\u0131 \u00f6nlemek i\u00e7in ger\u00e7ek etiketlerin 1 yerine 0.9 gibi bir de\u011fere ayarlanmas\u0131.<br \/>\n*   <strong>Farkl\u0131 Optimizat\u00f6rler ve \u00d6\u011frenme Oranlar\u0131<\/strong>: <code>Adam<\/code> yayg\u0131n olsa da, farkl\u0131 \u00f6\u011frenme oranlar\u0131 veya di\u011fer optimizat\u00f6rler (\u00f6rne\u011fin, RMSprop) denenebilir.<br \/>\n*   <strong>A\u011f Mimarisi \u0130yile\u015ftirmeleri<\/strong>: Daha fazla katman, farkl\u0131 filtre boyutlar\u0131, <code>BatchNormalization<\/code> ve <code>Dropout<\/code> katmanlar\u0131n\u0131n stratejik kullan\u0131m\u0131 performans\u0131 etkileyebilir.<\/p>\n<p>Basit GAN modelimiz, MNIST gibi nispeten basit bir veri k\u00fcmesinde bile belirli bir noktaya kadar iyi sonu\u00e7lar verebilir. Ancak, daha karma\u015f\u0131k veri k\u00fcmeleri (\u00f6rne\u011fin, ger\u00e7ek d\u00fcnya foto\u011fraflar\u0131) i\u00e7in daha geli\u015fmi\u015f GAN mimarilerine ve e\u011fitim tekniklerine ihtiya\u00e7 duyulacakt\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, TensorFlow k\u00fct\u00fcphanesini kullanarak basit bir \u00dcretken \u00c7eki\u015fmeli A\u011f&#8217;\u0131n (GAN) nas\u0131l in\u015fa edilece\u011fini ve e\u011fitilece\u011fini ayr\u0131nt\u0131l\u0131 olarak inceledik. GAN&#8217;lar\u0131n temel mimarisini olu\u015fturan \u00fcretici ve ay\u0131rt edici a\u011flar\u0131n rollerini, \u00e7al\u0131\u015fma prensiplerini ve birbirleriyle olan \u00e7eki\u015fmeli ili\u015fkilerini anlad\u0131k. MNIST veri k\u00fcmesi \u00fczerinde, rastgele g\u00fcr\u00fclt\u00fcden el yaz\u0131s\u0131 rakam g\u00f6r\u00fcnt\u00fcleri \u00fcretebilen bir GAN modelini ad\u0131m ad\u0131m in\u015fa ettik.<\/p>\n<p>TensorFlow&#8217;un Keras API&#8217;si, model katmanlar\u0131n\u0131 tan\u0131mlamay\u0131, kay\u0131p fonksiyonlar\u0131n\u0131 ve optimizat\u00f6rleri yap\u0131land\u0131rmay\u0131 olduk\u00e7a kolayla\u015ft\u0131rmaktad\u0131r. <code>tf.GradientTape<\/code>&#8216;in kullan\u0131m\u0131, \u00f6zel e\u011fitim d\u00f6ng\u00fcleri olu\u015fturmak ve gradyanlar\u0131 manuel olarak hesaplay\u0131p uygulamak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 sa\u011flamaktad\u0131r.<\/p>\n<p>GAN&#8217;lar, sentetik veri \u00fcretimi, veri art\u0131r\u0131m\u0131, g\u00f6r\u00fcnt\u00fc i\u015fleme ve hatta sanat gibi bir\u00e7ok alanda muazzam bir potansiyele sahiptir. Bu basit uygulama, GAN&#8217;lar\u0131n karma\u015f\u0131k d\u00fcnyas\u0131na sa\u011flam bir giri\u015f sa\u011flam\u0131\u015ft\u0131r. Ancak, GAN e\u011fitiminin do\u011fas\u0131nda var olan zorluklar (mod \u00e7\u00f6kmesi, karars\u0131zl\u0131k) ve bu sorunlar\u0131 a\u015fmak i\u00e7in geli\u015ftirilen \u00e7e\u015fitli ileri teknikler (DCGAN, WGAN, cGAN vb.) g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r.<\/p>\n<p>Bu temel bilgiyi edinerek, okuyucular daha karma\u015f\u0131k GAN mimarilerini ke\u015ffetmeye ve ger\u00e7ek d\u00fcnya problemlerini \u00e7\u00f6zmek i\u00e7in bu g\u00fc\u00e7l\u00fc \u00fcretken modelleri kullanmaya bir ad\u0131m daha yakla\u015fm\u0131\u015flard\u0131r. Gelecekte, GAN&#8217;lar\u0131n daha da geli\u015ftirilmesi ve farkl\u0131 uygulama alanlar\u0131nda kullan\u0131lmas\u0131yla yapay zeka alan\u0131nda yeni ufuklar a\u00e7\u0131lmaya devam edecektir.<br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek\nGiri\u015f\nYapay zeka ve makine \u00f6\u011frenimi alan\u0131ndaki geli\u015fmeler, bilgisay","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-36348","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek\" \/>\n<meta property=\"og:description\" content=\"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek Giri\u015f Yapay zeka ve makine \u00f6\u011frenimi alan\u0131ndaki geli\u015fmeler, bilgisay\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-14T09:40:48+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek\",\"datePublished\":\"2025-12-14T09:40:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/\"},\"wordCount\":2586,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/\",\"name\":\"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-14T09:40:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/","og_locale":"tr_TR","og_type":"article","og_title":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek","og_description":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek Giri\u015f Yapay zeka ve makine \u00f6\u011frenimi alan\u0131ndaki geli\u015fmeler, bilgisay","og_url":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-14T09:40:48+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek","datePublished":"2025-12-14T09:40:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/"},"wordCount":2586,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/","url":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/","name":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-14T09:40:48+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/tensorflow-kullanarak-basit-bir-uretken-cekismeli-ag-gan-insa-etmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TensorFlow Kullanarak Basit Bir \u00dcretken \u00c7eki\u015fmeli A\u011f (GAN) \u0130n\u015fa Etmek"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36348"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36348\/revisions"}],"predecessor-version":[{"id":36349,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36348\/revisions\/36349"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}