快速看懂如何使用GAN生成“真實”的人臉

本文只是簡要介紹生成對抗網絡(GAN)以及如何構建人臉生成器。

GAN與其他類型的神經網絡採用不同的學習方法。GAN的算法體系結構使用了兩個神經網絡,分別稱為GeneratorDiscriminator,它們相互競爭以產生所需的結果。生成器的工作是創建看起來逼真的假圖像,而判別器的工作是區分真實圖像和假圖像。如果兩者均能正常工作,則結果是看起來像真實照片的圖像。#科技種草團#

為什麼首先開發GAN?

大多數主流的神經網絡很容易通過在原始數據中加入少量的噪聲而被錯誤地分類。出乎意料的是,添加噪聲後的模型比正確預測的模型對錯誤預測的置信度更高。造成這種的原因是大多數機器學習模型都是從有限的數據中學習的,這是一個巨大的缺點,因為它很容易過度擬合。同樣,輸入和輸出之間的映射幾乎是線性的。儘管看起來各個類之間的分隔邊界似乎是線性的,但實際上它們是由線性組成的,即使特徵空間中某個點的微小變化也可能導致數據分類錯誤。

快速看懂如何使用GAN生成“真實”的人臉

例子1


快速看懂如何使用GAN生成“真實”的人臉

例子2

GAN如何工作?

GAN通過使兩個神經網絡相互競爭來學習數據集的概率分佈。
一個叫做Generator的神經網絡生成新的數據實例,而另一個Discriminator評估它們的真實性。即,判別器決定它檢查的數據的每個實例是否屬於實際的訓練數據集。

同時,生成器正在創建新的合成/偽造圖像,並將其傳遞給判別器 。這樣做是為了希望即使它們是假的,它們也將被認為是真實的。偽造的圖像是使用稱為轉置卷積的卷積逆運算從100維噪聲(在-1.0到1.0之間的均勻分佈)生成的。

生成器的目標是生成可傳遞的圖像:說謊而不被察覺。判別器的目的是將來自生成器的圖像識別為偽造的。

以下是GAN採取的步驟:

  • 生成器接受隨機數並返回圖像。
  • 生成的圖像與從實際的真實數據集中獲取的圖像流一起饋入判別器。
  • 判別器同時獲取真實圖像和偽造圖像,並返回概率(介於0和1之間的數字),其中1代表真實的,0代表偽造的。

因此,您有一個雙重反饋循環:

  • 判別器處於反饋循環中,具有圖像的基本事實,這是我們知道的。
  • 生成器與判別器處於反饋迴路中。
快速看懂如何使用GAN生成“真實”的人臉

GAN背後的數學

判別器的工作是執行二進制分類以在真實與偽造之間進行檢測,因此其損失函數為二進制交叉熵。生成器所做的就是從噪聲到真實數據的密度估計,並將其饋送到判別器以使其模糊。
設計中遵循的方法是將它建模為一個極大/極小的遊戲。現在讓我們來看看成本函數:

快速看懂如何使用GAN生成“真實”的人臉

第一項J(D)表示將實際數據提供給判別器,判別器將要最大化預測一個的對數概率,從而表明數據是真實的。第二項J(G)代表由生成的樣本。在此,判別器將要最大化預測零的對數概率,這表明數據是偽造的。另一方面,生成器試圖使判別器正確的對數概率最小。該問題的解是對策的平衡點。

快速看懂如何使用GAN生成“真實”的人臉

GAN的架構

D()給出給定樣本來自訓練數據X的概率。對於生成器,我們要最小化,log(1-D(G(z))即,當值D(G(z))很高時,D將假設G(z)X之外什麼都不是,這使得它1-D(G(z))非常低,並且我們希望將其最小化,即使降低。對於判別器,我們要最大化D(X)和(1-D(G(z)))。因此,D的最佳狀態為P(x)=0.5。但是,我們要訓練生成器G,使其生成判別器D的結果,以使D無法區分z和X。

現在的問題是為什麼這是一個極小極大函數?這是因為判別器試圖最大化目標,而生成器試圖最小化目標,由於這種最小化/最大化,我們得到了最小最大項。他們都通過交替的梯度下降一起學習。

儘管GAN的概念在理論上很簡單,但要建立一個有效的模型卻非常困難。在GAN中,有兩個深層網絡耦合在一起,使得反向傳播梯度的難度提高了兩倍。

深度卷積GAN(DCGAN)是演示如何構建實用的GAN的模型之一,該GAN可以自己學習如何合成新圖像。DCGAN與GAN非常相似,但專門致力於使用深度卷積網絡代替Vanilla GAN中使用的全連接網絡。

卷積網絡有助於發現圖像中的深層相關性,即它們尋找空間相關性。這意味著DCGAN將是圖像/視頻數據的更好選擇,而GAN可以被認為是DCGAN和許多其他體系結構(CGAN,CycleGAN,StarGAN等)已經發展起來的一般思想。


讓我們加載數據集並查看輸入圖像的外觀:

<code>import numpy as np
import pandas as pd
import os
import tensorflow as tf

PIC_DIR = 'D:/Jupyter/celeba-dataset/img_align_celeba/img_align_celeba/'
    
from tqdm import tqdm
from PIL import Image

IMAGES_COUNT = 10000

ORIG_WIDTH = 178
ORIG_HEIGHT = 208
diff = (ORIG_HEIGHT - ORIG_WIDTH) // 2

WIDTH = 128
HEIGHT = 128

crop_rect = (0, diff, ORIG_WIDTH, ORIG_HEIGHT - diff)

images = []
for pic_file in tqdm(os.listdir(PIC_DIR)[:IMAGES_COUNT]):
    pic = Image.open(PIC_DIR + pic_file).crop(crop_rect)
    pic.thumbnail((WIDTH, HEIGHT), Image.ANTIALIAS)
    images.append(np.uint8(pic))/<code>
快速看懂如何使用GAN生成“真實”的人臉

顯示我們圖像的格式

<code>images = np.array(images) / 255
print(images.shape)


from matplotlib import pyplot as plt/<code>
快速看懂如何使用GAN生成“真實”的人臉

我們的部分圖像輸出出來:

<code>plt.figure(1, figsize=(10, 10))
for i in range(25):
    plt.subplot(5, 5, i+1)
    plt.imshow(images[i])
    plt.axis('off')
plt.show()/<code>
快速看懂如何使用GAN生成“真實”的人臉

下一步是創建一個生成器:

生成器則採用另一種方式:試圖欺騙判別器的是藝術家。該網絡由8個卷積層組成。在這裡,首先,我們接受輸入,gen_input並將其輸入到第一個卷積層中。每個卷積層都執行卷積,然後執行批歸一化以及leaky ReLu。然後,我們返回tanh激活函數。

<code>from keras import Input
from keras.layers import Dense, Reshape, LeakyReLU, Conv2D, Conv2DTranspose, Flatten, Dropout
from keras.models import Model
from keras.optimizers import RMSprop

LATENT_DIM = 32
CHANNELS = 3

def create_generator():
    gen_input = Input(shape=(LATENT_DIM, ))

    x = Dense(128 * 16 * 16)(gen_input)
    x = LeakyReLU()(x)
    x = Reshape((16, 16, 128))(x)

    x = Conv2D(256, 5, padding='same')(x)
    x = LeakyReLU()(x)

    x = Conv2DTranspose(256, 4, strides=2, padding='same')(x)
    x = LeakyReLU()(x)

    x = Conv2DTranspose(256, 4, strides=2, padding='same')(x)
    x = LeakyReLU()(x)

    x = Conv2DTranspose(256, 4, strides=2, padding='same')(x)
    x = LeakyReLU()(x)

    x = Conv2D(512, 5, padding='same')(x)
    x = LeakyReLU()(x)
    x = Conv2D(512, 5, padding='same')(x)
    x = LeakyReLU()(x)
    x = Conv2D(CHANNELS, 7, activation='tanh', padding='same')(x)

    generator = Model(gen_input, x)
    return generator/<code>
快速看懂如何使用GAN生成“真實”的人臉

接下來,創建一個判別器:

判別器網絡由與生成器相同的卷積層組成。對於網絡的每一層,我們將執行卷積,然後將執行批歸一化以使網絡更快,更準確,最後,我們將執行Leaky ReLu。

<code>def create_discriminator():
    disc_input = Input(shape=(HEIGHT, WIDTH, CHANNELS))

    x = Conv2D(256, 3)(disc_input)
    x = LeakyReLU()(x)

    x = Conv2D(256, 4, strides=2)(x)
    x = LeakyReLU()(x)

    x = Conv2D(256, 4, strides=2)(x)
    x = LeakyReLU()(x)

    x = Conv2D(256, 4, strides=2)(x)
    x = LeakyReLU()(x)

    x = Conv2D(256, 4, strides=2)(x)
    x = LeakyReLU()(x)

    x = Flatten()(x)
    x = Dropout(0.4)(x)

    x = Dense(1, activation='sigmoid')(x)
    discriminator = Model(disc_input, x)

    optimizer = RMSprop(
        lr=.0001,
        clipvalue=1.0,
        decay=1e-8
    )

    discriminator.compile(
        optimizer=optimizer,
        loss='binary_crossentropy'
    )

    return discriminator/<code>
快速看懂如何使用GAN生成“真實”的人臉

定義GAN模型:

接下來,

可以定義GAN模型,將生成器模型和判別器模型組合為一個更大的模型。此更大的模型將用於使用判別器模型計算的輸出和誤差來訓練生成器中的模型權重。區分模型是單獨訓練的,因此,在此較大的GAN模型中,模型權重被標記為不可訓練,以確保僅更新生成器模型的權重。這種對判別器權重可訓練性的改變只在訓練組合GAN模型時發生,而在單獨訓練判別器時不發生。

這個更大的GAN模型將潛在空間中的一個點作為輸入,使用生成器模型生成圖像,將其作為輸入饋送到判別器模型,然後輸出或分類為真實或偽造。

由於判別器的輸出是S形的,因此我們使用二進制交叉熵來表示損失。在這種情況下,與Adam相比,RMSProp作為優化程序可生成更逼真的偽圖像。學習率是0.0001。在隨後的訓練中,輕型衰減和修剪值穩定了學習。如果要調整學習率,則必須調整衰減。

GAN嘗試複製概率分佈。因此,我們應該使用損失函數來反映GAN生成的數據的分佈與實際數據的分佈之間的距離。

<code>generator = create_generator()
discriminator = create_discriminator()
discriminator.trainable = False

gan_input = Input(shape=(LATENT_DIM, ))
gan_output = discriminator(generator(gan_input))
gan = Model(gan_input, gan_output)

optimizer = RMSprop(lr=.0001, clipvalue=1.0, decay=1e-8)
gan.compile(optimizer=optimizer, loss='binary_crossentropy')/<code>

我們不僅要定義一個損失函數,還需要定義三個:生成器的損失,使用真是圖像時的判別器損失和使用假圖像時的判別器損失。偽造的圖像損失與真實的圖像損失之和就是總的判別器損失。

訓練GAN模型:

訓練是最困難的部分,並且由於GAN包含兩個單獨訓練的網絡,因此它的訓練算法必須解決兩個複雜問題:

  • GAN必須兼顧兩種不同的訓練(生成器和判別器)。
  • GAN收斂很難確定。

隨著生成器在訓練中的改進,判別器的性能會變差,因為判別器無法輕易分辨真假之間的區別。如果生成器成功完成,則判別器的準確性為50%。實際上,判別器會向擲硬幣那樣進行預測。

這種進展為GAN的整體收斂提出了一個問題:隨著時間的流逝,判別器反饋的意義逐漸減弱。如果GAN繼續進行訓練,直到判別器給出完全隨機的反饋,則生成器將開始根據垃圾反饋進行訓練,其質量可能會下降。

隨著時間的流逝,我們周圍存在的這些算法在做事上會越來越好,這意味著這些生成模型在生成模仿對象方面可能會變得更好。很有可能另一個嶄新的生成模型即將出現。這項技術可以用於許多美好的事物。但是,還有潛在的不良後果。在這樣的世界中,宣傳可能會更容易傳播。本質上,這些新的生成模型具有足夠的時間和數據,它們幾乎可以從任何分佈生成令人信服的樣本。

結論:GAN的未來

無監督學習是人工智能的下一個前沿領域,我們正在朝著它前進。GAN和生成模型一般都很有趣且令人困惑。它們向我們越來越依賴人工智能的世界邁出了又一步。GAN在諸如生成圖像數據集示例,生成真實照片,圖像到圖像翻譯,文本到圖像翻譯,語義圖像到照片翻譯,面部正面視圖生成等情況下具有大量應用程序新的人類姿勢,面部老化,視頻預測,3D對象生成等。

快速看懂如何使用GAN生成“真實”的人臉


分享到:


相關文章: