衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

生成式對抗網(wǎng)絡(luò)基礎(chǔ)知識直觀解讀

mK5P_AItists ? 來源:未知 ? 作者:胡薇 ? 2018-05-14 08:29 ? 次閱讀

大家都知道,自從生成式對抗網(wǎng)絡(luò)(GAN)出現(xiàn)以來,便在圖像處理方面有著廣泛的應(yīng)用。但還是有很多人對于GAN不是很了解,擔(dān)心由于沒有數(shù)學(xué)知識底蘊而學(xué)不會GAN。在本文中,谷歌研究員Stefan Hosein提供了一份初學(xué)者入門GAN的教程,在這份教程中,即使你沒有擁有深厚的數(shù)學(xué)知識,你也能夠了解什么是生成式對抗網(wǎng)絡(luò)(GAN)。

類比

理解GAN的一個最為簡單的方法是通過一個簡單的比喻:

假設(shè)有一家商店,店主要從顧客那里購買某些種類的葡萄酒,然后再將這些葡萄酒銷售出去。

然而,有些可惡的顧客為了賺取金錢而出售假酒。在這種情況下,店主必須能夠區(qū)分假酒和正宗的葡萄酒。

你可以想象,在最初的時候,偽造者在試圖出售假酒時可能會犯很多錯誤,并且店主很容易就會發(fā)現(xiàn)該酒不是正宗的葡萄酒。經(jīng)歷過這些失敗之后,偽造者會繼續(xù)嘗試使用不同的技術(shù)來模擬真正的葡萄酒,而有些方法最終會取得成功。現(xiàn)在,偽造者知道某些技術(shù)已經(jīng)能夠躲過店主的檢查,那么他就可以開始進一步對基于這些技術(shù)的假酒進行改善提升。

與此同時,店主可能會從其他店主或葡萄酒專家那里得到一些反饋,說明她所擁有的一些葡萄酒并不是原裝的。這意味著店主必須改進她的判別方式,從而確定葡萄酒是偽造的還是正宗的。偽造者的目標(biāo)是制造出與正宗葡萄酒無法區(qū)分的葡萄酒,而店主的目標(biāo)是準(zhǔn)確地分辨葡萄酒是否是正宗的。

可以這樣說,這種循環(huán)往復(fù)的競爭正是GAN背后的主要思想。

生成式對抗網(wǎng)絡(luò)的組成部分

通過上面的例子,我們可以提出一個GAN的體系結(jié)構(gòu)。

GAN中有兩個主要的組成部分:生成器和鑒別器。在上面我們所描述的例子中,店主被稱為鑒別器網(wǎng)絡(luò),通常是一個卷積神經(jīng)網(wǎng)絡(luò)(因為GAN主要用于圖像任務(wù)),主要是分配圖像是真實的概率。

偽造者被稱為生成式網(wǎng)絡(luò),并且通常也是一個卷積神經(jīng)網(wǎng)絡(luò)(具有解卷積層,deconvolution layers)。該網(wǎng)絡(luò)接收一些噪聲向量并輸出一個圖像。當(dāng)對生成式網(wǎng)絡(luò)進行訓(xùn)練時,它會學(xué)習(xí)可以對圖像的哪些區(qū)域進行改進/更改,以便鑒別器將難以將其生成的圖像與真實圖像區(qū)分開來。

生成式網(wǎng)絡(luò)不斷地生成與真實圖像更為接近的圖像,而與此同時,鑒別式網(wǎng)絡(luò)則試圖確定真實圖像和假圖像之間的差異。最終的目標(biāo)就是建立一個生成式網(wǎng)絡(luò),它可以生成與真實圖像無法區(qū)分的圖像。

用Keras編寫一個簡單的生成式對抗網(wǎng)絡(luò)

現(xiàn)在,你已經(jīng)了解什么是GAN,以及它們的主要組成部分,那么現(xiàn)在我們可以開始試著編寫一個非常簡單的代碼。你可以使用Keras,如果你不熟悉這個Python庫的話,則應(yīng)在繼續(xù)進行操作之前閱讀本教程。本教程基于易于理解的GAN進行開發(fā)的。

首先,你需要做的第一件事是通過pip安裝以下軟件包:

- keras

- matplotlib

- tensorflow

- tqdm

你將使用matplotlib繪圖,tensorflow作為Keras后端庫和tqdm,以顯示每個輪數(shù)(迭代)的花式進度條。

下一步是創(chuàng)建一個Python腳本,在這個腳本中,你首先需要導(dǎo)入你將要使用的所有模塊和函數(shù)。在使用它們時將給出每個解釋。

importos

import numpy as np

import matplotlib.pyplot as plt

from tqdm import tqdm

from keras.layers import Input

from keras.models import Model, Sequential

from keras.layers.core import Dense, Dropout

from keras.layers.advanced_activations import LeakyReLU

from keras.datasets import mnist

from keras.optimizers import Adam

from keras import initializers

你現(xiàn)在需要設(shè)置一些變量:

# Let Keras know that we are using tensorflow as our backend engine

os.environ["KERAS_BACKEND"] = "tensorflow"

# To make sure that we can reproduce the experiment and get the same results

np.random.seed(10)

# The dimension of our random noise vector.

random_dim = 100

在開始構(gòu)建鑒別器和生成器之前,你首先應(yīng)該收集數(shù)據(jù),并對其進行預(yù)處理。你將會使用到常見的MNIST數(shù)據(jù)集,該數(shù)據(jù)集具有一組從0到9的單個數(shù)字圖像。

MINST數(shù)字樣本

def load_minst_data():

# load the data

(x_train, y_train), (x_test, y_test) = mnist.load_data()

# normalize our inputs to be in the range[-1, 1]

x_train = (x_train.astype(np.float32) - 127.5)/127.5

# convert x_train with a shape of (60000, 28, 28) to (60000, 784) so we have

# 784 columns per row

x_train = x_train.reshape(60000, 784)

return (x_train, y_train, x_test, y_test)

需要注意的是,mnist.load_data()是Keras的一部分,這使得你可以輕松地將MNIST數(shù)據(jù)集導(dǎo)入至工作區(qū)域中。

現(xiàn)在,你可以開始創(chuàng)建你的生成器和鑒別器網(wǎng)絡(luò)了。在這一過程中,你會使用到Adam優(yōu)化器。此外,你還需要創(chuàng)建一個帶有三個隱藏層的神經(jīng)網(wǎng)絡(luò),其激活函數(shù)為Leaky Relu。對于鑒別器而言,你需要為其添加dropout層(dropout layers),以提高對未知圖像的魯棒性。

def get_optimizer():

return Adam(lr=0.0002, beta_1=0.5)

def get_generator(optimizer):

generator = Sequential()

generator.add(Dense(256, input_dim=random_dim, kernel_initializer=initializers.RandomNormal(stddev=0.02)))

generator.add(LeakyReLU(0.2))

generator.add(Dense(512))

generator.add(LeakyReLU(0.2))

generator.add(Dense(1024))

generator.add(LeakyReLU(0.2))

generator.add(Dense(784, activation='tanh'))

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

return generator

def get_discriminator(optimizer):

discriminator = Sequential()

discriminator.add(Dense(1024, input_dim=784, kernel_initializer=initializers.RandomNormal(stddev=0.02)))

discriminator.add(LeakyReLU(0.2))

discriminator.add(Dropout(0.3))

discriminator.add(Dense(512))

discriminator.add(LeakyReLU(0.2))

discriminator.add(Dropout(0.3))

discriminator.add(Dense(256))

discriminator.add(LeakyReLU(0.2))

discriminator.add(Dropout(0.3))

discriminator.add(Dense(1, activation='sigmoid'))

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

return discriminator

接下來,則需要將發(fā)生器和鑒別器組合在一起!

def get_gan_network(discriminator, random_dim, generator, optimizer):

# We initially set trainable to False since we only want to train either the

# generator or discriminator at a time

discriminator.trainable = False

# gan input (noise) will be 100-dimensional vectors

gan_input = Input(shape=(random_dim,))

# the output of the generator (an image)

x = generator(gan_input)

# get the output of the discriminator (probability if the image is real or not)

gan_output = discriminator(x)

gan = Model(inputs=gan_input, outputs=gan_output)

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

return gan

為了完整起見,你還可以創(chuàng)建一個函數(shù),使其每訓(xùn)練20個輪數(shù)就對生成的圖像進行1次保存。由于這不是本次課程的核心內(nèi)容,因此你不必完全理解該函數(shù)。

def plot_generated_images(epoch, generator, examples=100, dim=(10, 10), figsize=(10, 10)):

noise = np.random.normal(0, 1, size=[examples, random_dim])

generated_images = generator.predict(noise)

generated_images = generated_images.reshape(examples, 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', cmap='gray_r')

plt.axis('off')

plt.tight_layout()

plt.savefig('gan_generated_image_epoch_%d.png' % epoch)

你現(xiàn)在已經(jīng)編碼了大部分網(wǎng)絡(luò),剩下的就是訓(xùn)練這個網(wǎng)絡(luò),并查看你創(chuàng)建的圖像。

def train(epochs=1, batch_size=128):

# Get the training and testing data

x_train, y_train, x_test, y_test = load_minst_data()

# Split the training data into batches of size 128

batch_count = x_train.shape[0] / batch_size

# Build our GAN netowrk

adam = get_optimizer()

generator = get_generator(adam)

discriminator = get_discriminator(adam)

gan = get_gan_network(discriminator, random_dim, generator, adam)

for e in xrange(1, epochs+1):

print '-'*15, 'Epoch %d' % e, '-'*15

for _ in tqdm(xrange(batch_count)):

# Get a random set of input noise and images

noise = np.random.normal(0, 1, size=[batch_size, random_dim])

image_batch = x_train[np.random.randint(0, x_train.shape[0], size=batch_size)]

# Generate fake MNIST images

generated_images = generator.predict(noise)

X = np.concatenate([image_batch, generated_images])

# Labels for generated and real data

y_dis = np.zeros(2*batch_size)

# One-sided label smoothing

y_dis[:batch_size] = 0.9

# Train discriminator

discriminator.trainable = True

discriminator.train_on_batch(X, y_dis)

# Train generator

noise = np.random.normal(0, 1, size=[batch_size, random_dim])

y_gen = np.ones(batch_size)

discriminator.trainable = False

gan.train_on_batch(noise, y_gen)

if e == 1 or e % 20 == 0:

plot_generated_images(e, generator)

if __name__ == '__main__':

train(400, 128)

在訓(xùn)練400個輪數(shù)后,你可以查看生成的圖像。在查看經(jīng)過1個輪數(shù)訓(xùn)練后而生成的圖像時,你會發(fā)現(xiàn)它沒有任何真實結(jié)構(gòu),在查看經(jīng)過40個輪數(shù)訓(xùn)練后而生成的圖像時,你會發(fā)現(xiàn)數(shù)字開始成形,最后,在查看經(jīng)過400個輪數(shù)訓(xùn)練后而生成的圖像時,你會發(fā)現(xiàn),除了一組數(shù)字難以辨識外,其余大多數(shù)數(shù)字都清晰可見。

訓(xùn)練1個輪數(shù)后的結(jié)果(上)| 訓(xùn)練40個輪數(shù)后的結(jié)果(中) | 訓(xùn)練400個輪數(shù)后的結(jié)果(下)

此代碼在CPU上運行一次大約需要2分鐘,這也是我們選擇該代碼的主要原因。你可以嘗試進行更多輪數(shù)的訓(xùn)練,并向生成器和鑒別器中添加更多數(shù)量(種類)的層。當(dāng)然,在僅使用CPU的前提下,采用更復(fù)雜和更深層的體系結(jié)構(gòu)時,相應(yīng)的代碼運行時間也會有所延長。但也不要因此放棄嘗試。

至此,你已經(jīng)完成了全部的學(xué)習(xí)任務(wù),你以一種直觀的方式學(xué)習(xí)了生成式對抗網(wǎng)絡(luò)(GAN)的基礎(chǔ)知識!并且,你還在Keras庫的協(xié)助下實現(xiàn)了你的第一個模型。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • GaN
    GaN
    +關(guān)注

    關(guān)注

    19

    文章

    1965

    瀏覽量

    74233

原文標(biāo)題:無需數(shù)學(xué)背景!谷歌研究員為你解密生成式對抗網(wǎng)絡(luò)

文章出處:【微信號:AItists,微信公眾號:人工智能學(xué)家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    華為網(wǎng)絡(luò)基礎(chǔ)知識教程

    華為網(wǎng)絡(luò)基礎(chǔ)知識教程
    發(fā)表于 08-18 15:16

    嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識

    第2章 嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識本章教程為大家介紹嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識,本章先讓大家有一個全
    發(fā)表于 08-03 06:24

    介紹嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識

    第2章 嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識本章教程為大家介紹嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識,本章先讓大家有一個全
    發(fā)表于 08-03 06:58

    介紹嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識

    第2章 嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識本章教程為大家介紹嵌入網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識,本章先讓大家有一個全
    發(fā)表于 08-04 08:17

    圖像生成對抗生成網(wǎng)絡(luò)

    圖像生成對抗生成網(wǎng)絡(luò)ganby Thalles Silva 由Thalles Silva暖身 (Warm up)Let’s say there’s a very cool party going
    發(fā)表于 09-15 09:29

    嵌入系統(tǒng)基礎(chǔ)知識

    關(guān)于嵌入系統(tǒng)基礎(chǔ)知識關(guān)于嵌入系統(tǒng)基礎(chǔ)知識關(guān)于嵌入系統(tǒng)基礎(chǔ)知識
    發(fā)表于 03-03 16:58 ?5次下載

    淺析生成對抗網(wǎng)絡(luò)發(fā)展的內(nèi)在邏輯

    生成對抗網(wǎng)絡(luò)(Generative adversarial networks, GAN)是當(dāng)前人工智能學(xué)界最為重要的研究熱點之一。其突出的生成
    的頭像 發(fā)表于 08-22 16:25 ?1w次閱讀

    新型生成對抗分層網(wǎng)絡(luò)表示學(xué)習(xí)算法

      針對當(dāng)前鏈路預(yù)測算法無法有效保留網(wǎng)絡(luò)圖髙階結(jié)構(gòu)特征的問題,提岀一種生成對抗分層網(wǎng)絡(luò)表示學(xué)習(xí)算法。根據(jù)網(wǎng)絡(luò)圖的一階鄰近性和二階鄰近性,遞
    發(fā)表于 03-11 10:53 ?16次下載
    新型<b class='flag-5'>生成對抗</b><b class='flag-5'>式</b>分層<b class='flag-5'>網(wǎng)絡(luò)</b>表示學(xué)習(xí)算法

    一種利用生成對抗網(wǎng)絡(luò)的超分辨率重建算法

    針對傳統(tǒng)圖像超分辨率重建算法存在網(wǎng)絡(luò)訓(xùn)練困難與生成圖像存在偽影的冋題,提岀一種利用生成對抗網(wǎng)絡(luò)
    發(fā)表于 03-22 15:40 ?4次下載
    一種利用<b class='flag-5'>生成</b><b class='flag-5'>式</b><b class='flag-5'>對抗</b><b class='flag-5'>網(wǎng)絡(luò)</b>的超分辨率重建算法

    基于生成對抗網(wǎng)絡(luò)的深度文本生成模型

    評論,對音樂作品自動生成評論可以在一定程度上解決此問題。在在線唱歌平臺上的評論文本與音樂作品的表現(xiàn)評級存在一定的關(guān)系。因此,研究考慮音樂作品評級信息的評論文本自動生成的方為此提出了一種基于生成
    發(fā)表于 04-12 13:47 ?15次下載
    基于<b class='flag-5'>生成</b><b class='flag-5'>式</b><b class='flag-5'>對抗</b><b class='flag-5'>網(wǎng)絡(luò)</b>的深度文本<b class='flag-5'>生成</b>模型

    基于生成對抗網(wǎng)絡(luò)的圖像補全方法

    圖像補全是數(shù)字圖像處理領(lǐng)域的重要研究方向,具有廣闊的應(yīng)用前景。提出了一種基于生成對抗網(wǎng)絡(luò)(GAN)的圖像補全方法。生成
    發(fā)表于 05-19 14:38 ?14次下載

    生成對抗網(wǎng)絡(luò)應(yīng)用及研究綜述

    基于零和博弈思想的生成對抗網(wǎng)絡(luò)(GAN)可通過無監(jiān)督學(xué)習(xí)獲得數(shù)據(jù)的分布,并生成較逼真的數(shù)據(jù)。基于GAN的基礎(chǔ)概念及理論框架,硏究各類GAN
    發(fā)表于 06-09 11:16 ?13次下載

    基于像素級生成對抗網(wǎng)絡(luò)的圖像彩色化模型

    基于像素級生成對抗網(wǎng)絡(luò)的圖像彩色化模型
    發(fā)表于 06-27 11:02 ?4次下載

    「自行科技」一文了解生成對抗網(wǎng)絡(luò)GAN

    生成對抗網(wǎng)絡(luò)(Generative adversarial network, GAN)是一種深度學(xué)習(xí)模型,是近年來復(fù)雜分布上無監(jiān)督學(xué)習(xí)最具前景的方法之一。
    的頭像 發(fā)表于 09-16 09:25 ?4202次閱讀

    生成對抗網(wǎng)絡(luò)(GANs)的原理與應(yīng)用案例

    生成對抗網(wǎng)絡(luò)(Generative Adversarial Networks,GANs)是一種由蒙特利爾大學(xué)的Ian Goodfellow等人在2014年提出的深度學(xué)習(xí)算法。GANs通過構(gòu)建兩個
    的頭像 發(fā)表于 07-09 11:34 ?1320次閱讀
    网上的百家乐官网是真是假 | 百家乐出庄几率| 易胜博娱乐| 基础百家乐官网的玩法技巧和规则 | 百家乐官网技巧下载| 威尼斯人娱乐城官网| 百家乐官网正确的打法| 百利宫百家乐现金网| 梭哈棋牌游戏大厅| 天猫百家乐官网娱乐城| 大发888游戏平台稳定大发888| 鼎龙百家乐官网的玩法技巧和规则| 大发888网址是什么| 新时代百家乐官网的玩法技巧和规则 | 百家乐官网游戏唯一官网站| 百家乐种类| 百家乐官网赌博赌博网站| 在线水果机游戏| 金樽百家乐官网的玩法技巧和规则| 棋牌下载| 百家乐胜率在哪| 网上真钱梭哈| 百家乐高手心得| 百家乐官网赌法| 威尼斯人娱乐信誉| 百家乐官网博弈之赢者理论坛| 悠游棋牌游戏| 百家乐玩法秘诀| 百家乐官网中P代表| 如何打百家乐的玩法技巧和规则| 百家乐官网赌博技巧网| 大发888注册送58网站| 巴比伦百家乐官网娱乐城| 佳豪国际| 武汉百家乐赌具| 百家乐官网北京| 大发888娱乐场开户| 百家乐官网最新分析仪| 德州市| 威尼斯人娱乐城梧州店| 百家乐官网网站|