国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

人工智能基礎(chǔ)部分20-生成對抗網(wǎng)絡(luò)(GAN)的實現(xiàn)應(yīng)用

這篇具有很好參考價值的文章主要介紹了人工智能基礎(chǔ)部分20-生成對抗網(wǎng)絡(luò)(GAN)的實現(xiàn)應(yīng)用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大家好,我是微學(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ù)。

人工智能基礎(chǔ)部分20-生成對抗網(wǎng)絡(luò)(GAN)的實現(xiàn)應(yīng)用

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ù):

人工智能基礎(chǔ)部分20-生成對抗網(wǎng)絡(luò)(GAN)的實現(xiàn)應(yīng)用

其中 表示期望值,表示自然對數(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)用效果。

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包