日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

plt生成固定的colormap_白话生成对抗网络GAN及代码实现

發(fā)布時間:2024/9/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 plt生成固定的colormap_白话生成对抗网络GAN及代码实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文主要是個簡單的筆記,參考資料來自下面三部分

  • Tutorial_HYLee_GAN
  • Renu Khandelwal 的博客
  • Jason 的博客
  • 神經(jīng)網(wǎng)絡一覽

    各種神經(jīng)網(wǎng)絡(全連接前向網(wǎng)絡、卷積神經(jīng)網(wǎng)絡、循環(huán)神經(jīng)網(wǎng)絡)的區(qū)別在于具有不同的輸入/輸出形式,比如可以是向量、矩陣或者是向量序列等。

    GAN的基本思想

    GAN由生成器和判別器組成:

    生成器的本質也是一個神經(jīng)網(wǎng)絡,或者說是一個函數(shù)

    如果給定一個向量可以生成一張漫畫圖片,向量的每一個維度具有不同含義

    判別器的本質也是一個神經(jīng)網(wǎng)絡

    如果給定一張圖片,判別器就會告訴你這是不是真實圖片

    所以GAN的訓練本質就是訓練兩個神經(jīng)網(wǎng)絡。

    GAN的工作原理

    生成器的目標是產(chǎn)生和訓練數(shù)據(jù)相似的數(shù)據(jù)(以假亂真的圖片),而判別器的目標是辨別真假。

    生成器的輸入通常為隨機噪聲,判別器有兩個輸入,一個來自訓練數(shù)據(jù)中的真圖片,一個來自生成器生成的假圖片。

    GAN的流程如下圖所示

    每一次迭代過程中:

  • 更新判別器的網(wǎng)絡參數(shù)。即給定假圖片以及假圖片的標簽(上圖中的generated example)、真圖片以及真圖片的標簽(上圖中的real example),讓判別器能夠區(qū)別出真假圖片,也就是訓練一個盡可能準確的二分類器。
  • 固定判別器網(wǎng)絡參數(shù), 更新生成器網(wǎng)絡。即給定假圖片以及假標簽(讓判別器以為假圖片是真的),從而誤差反向傳播來更新生成器,使得生成器生成更加逼真的照片。
  • GAN訓練的目標函數(shù)如下所示

    • 判別器想要最大化目標函數(shù)使得對于真實數(shù)據(jù) D(x) 接近 1,對于假數(shù)據(jù) D(G(z)) 接近 0
    • 生成器想要最小化目標函數(shù)使得 D(G(z)) 接近 1,也就是欺騙判別器讓它認為假數(shù)據(jù)為真

    GAN的實現(xiàn)

    這里采用 MNIST 數(shù)據(jù)集作為實驗數(shù)據(jù),最后我們會看到生成器能夠產(chǎn)生看起來像真的數(shù)字!

    導入需要用到的庫

    import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import keras from keras.layers import Dense, Dropout, Input from keras.models import Model,Sequential from keras.datasets import mnist from tqdm import tqdm from keras.layers.advanced_activations import LeakyReLU from keras.optimizers import Adam

    導入數(shù)據(jù)

    def load_data():(x_train, y_train), (x_test, y_test) = mnist.load_data()x_train = (x_train.astype(np.float32) - 127.5)/127.5# 將圖片轉為向量 x_train from (60000, 28, 28) to (60000, 784) # 每一行 784 個元素x_train = x_train.reshape(60000, 784)return (x_train, y_train, x_test, y_test) (X_train, y_train,X_test, y_test)=load_data() print(X_train.shape)

    定義優(yōu)化器

    def adam_optimizer():return Adam(lr=0.0002, beta_1=0.5)

    這里要采用的生成對抗網(wǎng)絡的結構如下圖所示

    定義生成器:輸入是 100 維,經(jīng)過三層隱藏層,輸出 784 維的向量(造假的圖片)

    def create_generator():generator=Sequential()generator.add(Dense(units=256,input_dim=100))generator.add(LeakyReLU(0.2))generator.add(Dense(units=512))generator.add(LeakyReLU(0.2))generator.add(Dense(units=1024))generator.add(LeakyReLU(0.2))generator.add(Dense(units=784, activation='tanh'))generator.compile(loss='binary_crossentropy', optimizer=adam_optimizer())return generator g=create_generator() g.summary()

    定義判別器:判別器的輸入為真實圖片或者由生成器造出來的假圖片(784維),經(jīng)過三層隱藏層,輸出類別(1 維)

    def create_discriminator():discriminator=Sequential()discriminator.add(Dense(units=1024,input_dim=784))discriminator.add(LeakyReLU(0.2))discriminator.add(Dropout(0.3))discriminator.add(Dense(units=512))discriminator.add(LeakyReLU(0.2))discriminator.add(Dropout(0.3))discriminator.add(Dense(units=256))discriminator.add(LeakyReLU(0.2))discriminator.add(Dense(units=1, activation='sigmoid'))discriminator.compile(loss='binary_crossentropy', optimizer=adam_optimizer())return discriminator d =create_discriminator() d.summary()

    定義生成對抗網(wǎng)絡

    def create_gan(discriminator, generator):discriminator.trainable=False# 這是一個鏈式模型:輸入經(jīng)過生成器、判別器得到輸出gan_input = Input(shape=(100,))x = generator(gan_input)gan_output= discriminator(x)gan= Model(inputs=gan_input, outputs=gan_output)gan.compile(loss='binary_crossentropy', optimizer='adam')return gan gan = create_gan(d,g) gan.summary()

    定義畫圖函數(shù)來可視化圖片的生成

    def plot_generated_images(epoch, generator, examples=100, dim=(10,10), figsize=(10,10)):noise= np.random.normal(loc=0, scale=1, size=[examples, 100])generated_images = generator.predict(noise)generated_images = generated_images.reshape(100,28,28)plt.figure(figsize=figsize)for i in range(generated_images.shape[0]):plt.subplot(dim[0], dim[1], i+1)plt.imshow(generated_images[i], interpolation='nearest')plt.axis('off')plt.tight_layout()plt.savefig('gan_generated_image %d.png' %epoch)

    生成對抗網(wǎng)絡的訓練函數(shù)

    def training(epochs=1, batch_size=128):#導入數(shù)據(jù)(X_train, y_train, X_test, y_test) = load_data()batch_count = X_train.shape[0] / batch_size# 定義生成器、判別器和GAN網(wǎng)絡generator= create_generator()discriminator= create_discriminator()gan = create_gan(discriminator, generator)for e in range(1,epochs+1 ):print("Epoch %d" %e)for _ in tqdm(range(int(batch_count))):#產(chǎn)生噪聲喂給生成器noise= np.random.normal(0,1, [batch_size, 100])# 產(chǎn)生假圖片generated_images = generator.predict(noise)# 一組隨機真圖片image_batch =X_train[np.random.randint(low=0,high=X_train.shape[0],size=batch_size)]# 真假圖片拼接 X= np.concatenate([image_batch, generated_images])# 生成數(shù)據(jù)和真實數(shù)據(jù)的標簽y_dis=np.zeros(2*batch_size)y_dis[:batch_size]=0.9# 預訓練,判別器區(qū)分真假discriminator.trainable=Truediscriminator.train_on_batch(X, y_dis)# 欺騙判別器 生成的圖片為真的圖片noise= np.random.normal(0,1, [batch_size, 100])y_gen = np.ones(batch_size)# GAN的訓練過程中判別器的權重需要固定 discriminator.trainable=False# GAN的訓練過程為交替“訓練判別器”和“固定判別器權重訓練鏈式模型”gan.train_on_batch(noise, y_gen)if e == 1 or e % 50 == 0:# 畫圖 看一下生成器能生成什么plot_generated_images(e, generator) training(400,256)

    經(jīng)過訓練后生成的圖片

    一個epoch后生成器還是個小學生

    100個epoch后生成器已經(jīng)有點樣子了

    400個epoch后生成器可以出師了

    是不是已經(jīng)學得像模像樣了,這樣就能夠利用噪聲通過生成器來生成以假亂真的圖片了。

    總結

    以上是生活随笔為你收集整理的plt生成固定的colormap_白话生成对抗网络GAN及代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。