大家好,我是微學(xué)AI,今天給大家介紹一下人工智能基礎(chǔ)部分20-生成對抗網(wǎng)絡(luò)(GAN)的原理與簡單應(yīng)用。生成對抗網(wǎng)絡(luò)是一種由深度學(xué)習(xí)模型構(gòu)成的神經(jīng)網(wǎng)絡(luò)系統(tǒng),由一個生成器和一個判別器相互博弈來提升模型的能力。本文將從以下幾個方面進行闡述:生成對抗網(wǎng)絡(luò)的概念、GAN的原理、GAN的實驗設(shè)計。
一、前言
隨著近年來人工智能發(fā)展的不斷加速,尤其是深度學(xué)習(xí)的出現(xiàn),使得計算機視覺領(lǐng)域取得了許多重要突破。生成對抗網(wǎng)絡(luò)(Generative Adversarial Networks,?GAN)是其中一種具有廣泛應(yīng)用前景的技術(shù)。GAN是一種生成式模型,它的主要原理是通過博弈論的方式,將生成模型與判別模型進行對抗訓(xùn)練,從而實現(xiàn)生成圖像、音頻等數(shù)據(jù)的任務(wù)。本文將對GAN?的工作原理進行詳細解釋,并通過一個圖像生成示例項目,展示如何使用 PyTorch 框架實現(xiàn) GAN,并給出實驗結(jié)果與完整代碼。
二、生成對抗網(wǎng)絡(luò)(GAN)原理
GAN的核心思想是讓兩個網(wǎng)絡(luò)(生成器和判別器)進行博弈,最終迭代得到一個高質(zhì)量的生成器。生成器的任務(wù)是生成與真實數(shù)據(jù)分布相近的偽數(shù)據(jù),而判別器的任務(wù)則是判斷輸入數(shù)據(jù)是來源于真實數(shù)據(jù)還是偽數(shù)據(jù)。通過優(yōu)化生成器與判別器的博弈過程,使得生成器逐漸改進,能夠生成越來越接近真實數(shù)據(jù)的偽數(shù)據(jù)。
2.1 生成器
生成器的主要作用是以隨機噪聲為輸入,輸出生成的偽數(shù)據(jù)。隨機噪聲是一個高斯分布的向量,我們可以通過一個深度神經(jīng)網(wǎng)絡(luò)模型(如卷積神經(jīng)網(wǎng)絡(luò)、前饋神經(jīng)網(wǎng)絡(luò)等)將這個高斯分布的向量映射成我們想要輸出的偽數(shù)據(jù)。
2.2 判別器
判別器是一個二分類神經(jīng)網(wǎng)絡(luò)模型,輸入可能來自生成器也可能來自真實數(shù)據(jù)。其任務(wù)是對輸入數(shù)據(jù)進行分類,輸出一個概率值以判斷輸入數(shù)據(jù)是來自真實數(shù)據(jù)集還是生成器生成的偽數(shù)據(jù)。
2.3 博弈過程
生成器與判別器博弈的過程即是各自的訓(xùn)練過程。生成器訓(xùn)練的目標(biāo)是使得判別器對其生成的數(shù)據(jù)預(yù)測為真實數(shù)據(jù)的概率最大;判別器訓(xùn)練的目標(biāo)是使得自身對真實數(shù)據(jù)與生成的數(shù)據(jù)的分類準(zhǔn)確率最高。通過反復(fù)迭代這個過程,最終生成器能夠生成越來越接近真實數(shù)據(jù)的偽數(shù)據(jù)。
2.4 數(shù)學(xué)原理
生成對抗網(wǎng)絡(luò)(Generative Adversarial Networks,簡稱 GAN)是一種基于博弈論的生成模型,其數(shù)學(xué)原理可以用以下公式表示:
假設(shè)表示真實數(shù)據(jù)的分布, 表示生成器輸入隨機噪聲 的分布,表示生成器的輸出,其中 是生成器的參數(shù), 表示判別器的輸出,其中是判別器的參數(shù)。
GAN 的目標(biāo)是最小化以下?lián)p失函數(shù):
其中 表示期望值,表示自然對數(shù)。
這個損失函數(shù)的含義是:最小化生成器生成的數(shù)據(jù)與真實數(shù)據(jù)之間的差距,同時最大化判別器對生成器生成的數(shù)據(jù)和真實數(shù)據(jù)的區(qū)分度。具體來說,第一項表示真實數(shù)據(jù)被判別為真實數(shù)據(jù)的概率,第二項 表示生成器生成的虛構(gòu)數(shù)據(jù)被判別為虛構(gòu)數(shù)據(jù)的概率。
在訓(xùn)練過程中,GAN 會交替訓(xùn)練生成器和判別器,通過最小化損失函數(shù) 來優(yōu)化模型參數(shù)。具體來說,對于每個訓(xùn)練迭代,我們首先固定生成器的參數(shù),通過最大化損失函數(shù) 來優(yōu)化判別器的參數(shù)。然后,我們固定判別器的參數(shù),通過最小化損失函數(shù) 來優(yōu)化生成器的參數(shù)。這個過程會一直迭代下去,直到達到預(yù)定的迭代次數(shù)或者損失函數(shù)收斂。
三、實驗設(shè)計
本文使用 tensorflow? 框架實現(xiàn) GAN,并在圖像生成任務(wù)上進行訓(xùn)練。實驗workflow 分為以下五個步驟:數(shù)據(jù)準(zhǔn)備\構(gòu)建生成器與判別器\設(shè)置損失函數(shù)與優(yōu)化器、訓(xùn)練過程,讓我們先從數(shù)據(jù)準(zhǔn)備開始。
四、代碼實現(xiàn)
下面我們將使用MNIST(手寫數(shù)字化)這一經(jīng)典的數(shù)據(jù)集來展示GANs的實際應(yīng)用效果。文章來源:http://www.zghlxwxcb.cn/news/detail-494685.html
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# 設(shè)置隨機種子以獲得可重現(xiàn)的結(jié)果
np.random.seed(42)
tf.random.set_seed(42)
# 加載MNIST數(shù)據(jù)集
(x_train, y_train), (_, _) = keras.datasets.mnist.load_data()
# 將數(shù)據(jù)規(guī)范化到[-1, 1]范圍內(nèi)
x_train = x_train.astype(np.float32) / 127.5 - 1
# 將數(shù)據(jù)集重塑為(-1, 28, 28, 1)
x_train = np.expand_dims(x_train, axis=-1)
# 創(chuàng)建生成器模型
def create_generator():
generator = keras.Sequential()
generator.add(layers.Dense(7 * 7 * 256, use_bias=False, input_shape=(100,)))
generator.add(layers.BatchNormalization())
generator.add(layers.LeakyReLU(alpha=0.2))
generator.add(layers.Reshape((7, 7, 256)))
generator.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias = False))
generator.add(layers.BatchNormalization())
generator.add(layers.LeakyReLU(alpha=0.2))
generator.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias = False))
generator.add(layers.BatchNormalization())
generator.add(layers.LeakyReLU(alpha=0.2))
generator.add(
layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias = False, activation ='tanh'))
return generator
generator = create_generator()
# 創(chuàng)建鑒別器模型
def create_discriminator():
discriminator = keras.Sequential()
discriminator.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape = (28, 28, 1)))
discriminator.add(layers.LeakyReLU(alpha=0.2))
discriminator.add(layers.BatchNormalization())
discriminator.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
discriminator.add(layers.LeakyReLU(alpha=0.2))
discriminator.add(layers.BatchNormalization())
discriminator.add(layers.Flatten())
discriminator.add(layers.Dropout(0.2))
discriminator.add(layers.Dense(1, activation='sigmoid'))
return discriminator
discriminator = create_discriminator()
# 編譯鑒別器
discriminator_optimizer = keras.optimizers.Adam(lr=0.0002, beta_1=0.5)
discriminator.compile(optimizer=discriminator_optimizer, loss='binary_crossentropy', metrics = ['accuracy'])
# 創(chuàng)建和編譯整體GAN結(jié)構(gòu)
discriminator.trainable = False
gan_input = keras.Input(shape=(100,))
gan_output = discriminator(generator(gan_input))
gan = keras.Model(gan_input, gan_output)
gan_optimizer = keras.optimizers.Adam(lr=0.0002, beta_1=0.5)
gan.compile(optimizer=gan_optimizer, loss='binary_crossentropy')
# 模型訓(xùn)練函數(shù)
def train_gan(epochs=100, batch_size=128):
num_examples = x_train.shape[0]
num_batches = num_examples // batch_size
for epoch in range(epochs):
for batch_idx in range(num_batches):
noise = np.random.normal(size=(batch_size, 100))
generated_images = generator.predict(noise)
real_images = x_train[(batch_idx * batch_size):((batch_idx + 1) * batch_size)]
all_images = np.concatenate([generated_images, real_images])
labels = np.zeros(2 * batch_size)
labels[batch_size:] = 1
# 在噪聲上加一點隨機數(shù),提高生成器的魯棒性
labels += 0.05 * np.random.rand(2 * batch_size)
discriminator_loss = discriminator.train_on_batch(all_images, labels)
noise = np.random.randn(batch_size, 100)
misleading_targets = np.ones(batch_size)
generator_loss = gan.train_on_batch(noise, misleading_targets)
if (batch_idx + 1) % 50 == 0:
print(
f"Epoch:{epoch + 1}/{epochs} Batch:{batch_idx + 1}/{num_batches} Discriminator Loss: {discriminator_loss[0]} Generator Loss:{generator_loss}")
train_gan()
以上實現(xiàn)了生成對抗網(wǎng)絡(luò)是訓(xùn)練過程,實際中我們可以替換數(shù)據(jù)訓(xùn)練自己的數(shù)據(jù)模型。文章來源地址http://www.zghlxwxcb.cn/news/detail-494685.html
到了這里,關(guān)于人工智能基礎(chǔ)部分20-生成對抗網(wǎng)絡(luò)(GAN)的實現(xiàn)應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!