日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
生成性對抗網(wǎng)絡——數(shù)據(jù)生成的高級解決方案

最近,數(shù)據(jù)科學界大力推廣生成性對抗網(wǎng)絡(Generative Adversarial Networks:簡稱“GAN”)。但是,當你開始了解它們時,你馬上就會明白其中的緣由。GAN架構簡直是一個天才的設計,主要是因為它“釋放”了現(xiàn)實數(shù)據(jù)生成和增強的巨大潛力。在本文中,我將首先向您介紹GAN的基礎知識,并向您展示如何使用Keras/Tensorflow庫在Python環(huán)境中編寫一個GAN。歸納起來,主要包括下面幾項內(nèi)容:

  • 機器學習算法中的GAN
  • GAN架構及其工作原理的直觀解釋
  • 通過一個詳細的Python示例演示如何從頭開始構建GAN

1.機器學習算法中的GAN 

即使是經(jīng)驗豐富的數(shù)據(jù)科學家也很容易在數(shù)百種不同的機器學習算法中迷失方向。為了歸納這些算法,我對一些最常見的算法進行了分類,并創(chuàng)建了一個可視化的旭日圖。

機器學習算法分類旭日圖

注意,這其中的一些算法相當靈活,可以應用于不同的任務。因此,任何分類算法都永遠不會是最完美的分類算法。盡管如此,能夠看到一個如此高層次的視圖仍然有重大意義。注意:原文中展示的圖表是交互式的,只要點擊不同類別的鏈接便可以了解更多對應的提示信息。因此,本譯文中提供的靜態(tài)圖表只能讓各位稍有一些遺憾了。

你會發(fā)現(xiàn),GAN也不過是神經(jīng)網(wǎng)絡的一個子類,它自身也進一步包含多個不同的子類型,如基本GAN(本文的重點)、條件GAN(cGAN)、深度卷積GAN(DCGAN)和我將在未來文章中介紹的其他類型。

2.GAN架構及其工作原理的直觀解釋 

生成性對抗網(wǎng)絡是深度學習機器,它將兩個單獨的模型組合到一個架構中。這兩個組件是:

  • 生成器模型
  • 鑒別器模型

這兩個模型在零和博弈中相互競爭。生成器模型嘗試生成與問題域中的數(shù)據(jù)樣本相似的新數(shù)據(jù)樣本。同時,鑒別器嘗試識別給出的樣本是假的(來自生成器)還是真的(來自實際數(shù)據(jù)域)。

生成器和鑒別器之間的競爭使它們成為對手,GAN由此而得名。

3.生成器模型 

首先,讓我們分析一下生成器模型,看看它是如何生成新的數(shù)據(jù)樣本的。

生成器模型示意圖

  • 生成器模型從潛在空間中采樣一個隨機向量。該空間遵循高斯分布,維數(shù)由我們指定。由于我們將隨機向量用作神經(jīng)網(wǎng)絡的輸入,因此隨機向量成為該生成過程的種子數(shù)據(jù)。
  • 輸入遵循一個或多個隱藏層的網(wǎng)絡標準路徑。在簡單的GAN架構的情況下,這將是一組緊密連接的層,而深度卷積GAN(DCGAN)也是包含卷積層的。
  • 數(shù)據(jù)流入輸出層,在這里我們可以進行最終調(diào)整,以確保生成器輸出結果數(shù)據(jù)中包含所需的形狀,以饋送到鑒別器。
  • 最后,我們可以使用這些假(生成)的樣本來測試和“愚弄”(fool)鑒別器。

4.鑒別器模型 

接下來,讓我們看看如何構造鑒別器模型。

鑒別器模型

  • 鑒別器模型的輸入是真實樣本(從問題域中提取)和虛假樣本(由生成器模型創(chuàng)建)的組合。
  • 數(shù)據(jù)通過具有一個或多個隱藏層的網(wǎng)絡,與任何其他神經(jīng)網(wǎng)絡中的數(shù)據(jù)相同。3、一旦我們到達輸出層,鑒別器就能夠決定樣本是真的還是假的(生成的)??傊?,鑒別器與標準神經(jīng)網(wǎng)絡分類模型沒有什么不同。

5.GAN模型 

生成性對抗網(wǎng)絡結合了相互競爭的生成器和鑒別器模型。下面的GAN架構圖說明了兩個模型是如何互連的。

GAN模型架構示意圖

如圖所示,我們將假的(生成的)和真實的樣本數(shù)據(jù)輸入鑒別器模型,對其進行訓練以區(qū)分這兩種類型。

隨著鑒別器更好地區(qū)分真假樣本數(shù)據(jù),生成器模型的權重和偏差會得到更新,以使其產(chǎn)生更令人信服的假樣本數(shù)據(jù)。

該過程將循環(huán)執(zhí)行若干遍(根據(jù)指定次數(shù)的世代),直到生成器和鑒別器在其各自特定任務中變得更好。最后,在極限情況下,生成器模型的輸出與實際輸出無法區(qū)分,鑒別器模型收斂到大約0.5的中性預測結果。

6.從頭開始構建一個基于Python的GAN示例  

本示例的目的是讓您從根本上了解GAN的工作原理。因此,我們將其應用于一個簡單的問題。

準備工作

我們將使用到下面一些庫:

  • Pandas、Numpy和Math庫,用于數(shù)據(jù)生成和操縱
  • Matplotlib、Graphviz和Plotly(可選),用于數(shù)據(jù)可視化
  • Tensorflow/Keras,用于構建神經(jīng)網(wǎng)絡

首先,讓我們導入庫:

# Tensorflow / Keras
from tensorflow import keras #用于構建神經(jīng)網(wǎng)絡
print('Tensorflow/Keras: %s' % keras.__version__) #打印版本
from keras.models import Sequential #用于組裝神經(jīng)網(wǎng)絡模型
from keras.layers import Dense #給神經(jīng)網(wǎng)絡模型增添一些層
from tensorflow.keras.utils import plot_model #繪制模型圖
#數(shù)據(jù)操縱
import numpy as np #用于數(shù)據(jù)操縱
print('numpy: %s' % np.__version__) #打印版本
import pandas as pd # 用于數(shù)據(jù)操縱
print('pandas: %s' % pd.__version__) #打印版本
import math #用于生成真實數(shù)據(jù)(本例中指向一個圓)
#可視化
import matplotlib
import matplotlib.pyplot as plt #用于數(shù)據(jù)可視化
print('matplotlib: %s' % matplotlib.__version__) #打印版本
import graphviz # for showing model diagram
print('graphviz: %s' % graphviz.__version__) # 打印版本
import plotly
import plotly.express as px # 用于數(shù)據(jù)可視化
print('plotly: %s' % plotly.__version__) # 打印版本
#其他工具
import sys
import os
#把主目錄賦值給一個變量
main_dir=os.path.dirname(sys.path[0])

以上代碼將打印出本例中使用的包的版本信息,如下所示:

  • Tensorflow/Keras: 2.7.0
  • numpy: 1.21.4
  • pandas: 1.3.4
  • matplotlib: 3.5.1
  • graphviz: 0.19.1
  • plotly: 5.4.0

接下來,我們將創(chuàng)建一個圓,并獲取其邊緣(圓周)上點的坐標。然后,我們將通過訓練生成器和鑒別器,讓GAN“識別”和“生成”這樣的圓。

#獲取其邊緣(圓周)上點的坐標的函數(shù)
def PointsInCircum(r,n=100):
return [(math.cos(2*math.pi/n*x)*r,math.sin(2*math.pi/n*x)*r) for x in range(0,n+1)]
# 保存組成半徑為2的圓的一組實數(shù)點的坐標
circle=np.array(PointsInCircum(r=2,n=1000))
#繪制圖表
plt.figure(figsize=(15,15), dpi=400)
plt.title(label='Real circle to be learned by the GAN generator', loc='center')
plt.scatter(circle[:,0], circle[:,1], s=5, color='black')
plt.show()

上面的代碼將生成1000個點,并繪制一個圓形。

由1000個點組成的圓

創(chuàng)建GAN模型

現(xiàn)在,我們已經(jīng)準備好了數(shù)據(jù)。接下來,讓我們開始定義和組裝我們的模型。我們將從生成器開始:

# 定義生成器模型
def generator(latent_dim, n_outputs=2):
model = Sequential(name="Generator") # 模型
#添加層
model.add(Dense(32, activation='relu', kernel_initializer='he_uniform', input_dim=latent_dim, name='Generator-Hidden-Layer-1')) #隱藏層
model.add(Dense(16, activation='relu', kernel_initializer='he_uniform', name='Generator-Hidden-Layer-2')) #隱藏層
model.add(Dense(n_outputs, activation='linear', name='Generator-Output-Layer')) #輸出層
return model
# 實例化
latent_dim=3
gen_model = generator(latent_dim)
#顯示模型總結信息并繪制模型圖
gen_model.summary()
plot_model(gen_model, show_shapes=True, show_layer_names=True, dpi=400)

生成器模型圖

如您所見,我們的生成器有三個輸入節(jié)點,因為我們決定從三維潛在空間中繪制一個隨機向量。注意,我們可以自由選擇潛在空間維度。

同時,輸出結果中顯示了兩個值,對應于二維空間中的一個點的x和y坐標。接下來,我們建立鑒別器模型:

# 建立鑒別器模型
def discriminator(n_inputs=2):
model = Sequential(name="Discriminator") #模型
#添加層
model.add(Dense(32, activation='relu', kernel_initializer='he_uniform', input_dim=n_inputs, name='Discriminator-Hidden-Layer-1')) #隱藏層
model.add(Dense(16, activation='relu', kernel_initializer='he_uniform', name='Discriminator-Hidden-Layer-2')) #隱藏層
model.add(Dense(1, activation='sigmoid', name='Discriminator-Output-Layer')) # 輸出層
#編譯模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
# 實例化
dis_model = discriminator()
#顯示模型總結信息并繪制模型圖
dis_model.summary()
plot_model(dis_model, show_shapes=True, show_layer_names=True, dpi=400)

鑒別器模型圖

鑒別器輸入采用兩個值,與生成器輸出對齊。同時,鑒別器輸出只是一個值,告訴我們模型對數(shù)據(jù)真實/虛假的信心有多大。接下來,我們結合這兩個模型來創(chuàng)建GAN。下面代碼中的一個關鍵細節(jié)是,我們使鑒別器模型不可訓練。我們這樣做是因為,我們想使用真實和虛假(生成)數(shù)據(jù)的組合分別訓練鑒別器。稍后,您將看到我們是如何做到這一點的。

def def_gan(generator, discriminator):
#我們不想在這個階段訓練鑒別器的權重。因此,使其不可訓練
discriminator.trainable = False
#結合這兩個模型
model = Sequential(name="GAN") # GAN 模型
model.add(generator) # 添加生成器
model.add(discriminator) # 添加鑒別器
#編譯模型
model.compile(loss='binary_crossentropy', optimizer='adam')
return model
# 實例化
gan_model = def_gan(gen_model, dis_model)
#顯示模型總結信息并繪制模型圖
gan_model.summary()
plot_model(gan_model, show_shapes=True, show_layer_names=True, dpi=400)

GAN模型示意圖

準備生成器和鑒別器的輸入

我們將創(chuàng)建三個簡單的函數(shù),用于輔助我們完成為兩個模型的采樣與生成數(shù)據(jù)。第一個函數(shù)的功能是從圓上采樣真實點數(shù)據(jù);第二個函數(shù)負責從潛在空間中提取隨機向量;第三個函數(shù)負責將潛在變量傳遞到生成器模型中以生成偽樣本數(shù)據(jù)。#構造函數(shù),使負責從我們的圓上采集隨機點數(shù)據(jù)

def real_samples(n):
#真實樣本數(shù)據(jù)
X = circle[np.random.choice(circle.shape[0], n, replace=True), :]
#類標簽
y = np.ones((n, 1))
return X, y
#生成潛在空間上的點數(shù)據(jù);我們將用于后面的生成器的輸入數(shù)據(jù)
def latent_points(latent_dim, n):
#生成潛在空間上的點數(shù)據(jù)
latent_input = np.random.randn(latent_dim * n)
#重新構造形狀:使成為網(wǎng)絡的批輸出
latent_input = latent_input.reshape(n, latent_dim)
return latent_input
#使用生成器生成n個偽樣本數(shù)據(jù),結合類標簽信息
def fake_samples(generator, latent_dim, n):
#生成潛在空間中的點
latent_output = latent_points(latent_dim, n)
#預測輸出(例如生成偽樣本數(shù)據(jù))
X = generator.predict(latent_output)
#創(chuàng)建類標簽
y = np.zeros((n, 1))
return X, y

?模型訓練和評估

最后兩個函數(shù)將幫助我們訓練模型,并在指定的時間間隔評估結果數(shù)據(jù)。首先,讓我們創(chuàng)建模型性能評估函數(shù):

def performance_summary(epoch, generator, discriminator, latent_dim, n=100):
#獲取真實數(shù)據(jù)的樣本
x_real, y_real = real_samples(n)
#在真實數(shù)據(jù)上評估鑒別器
_, real_accuracy = discriminator.evaluate(x_real, y_real, verbose=1)
#獲取假的(生成的)樣本
x_fake, y_fake = fake_samples(generator, latent_dim, n)
#在虛假(生成的)數(shù)據(jù)上評估鑒別器
_, fake_accuracy = discriminator.evaluate(x_fake, y_fake, verbose=1)
#總結鑒別器性能
print("Epoch number: ", epoch)
print("Discriminator Accuracy on REAL points: ", real_accuracy)
print("Discriminator Accuracy on FAKE (generated) points: ", fake_accuracy)
#創(chuàng)建二維散點圖以顯示真實和虛假(生成的)數(shù)據(jù)點
plt.figure(figsize=(4,4), dpi=150)
plt.scatter(x_real[:, 0], x_real[:, 1], s=5, color='black')
plt.scatter(x_fake[:, 0], x_fake[:, 1], s=5, color='red')
plt.show()

如您所見,上述函數(shù)分別對真實和虛假(生成)點對鑒別器進行了評估。然后繪制二維散點圖,以顯示這些點在二維平面上的位置。

最后,訓練函數(shù)如下:

def train(g_model, d_model, gan_model, latent_dim, n_epochs=10001, n_batch=256, n_eval=1000):
#我們訓練鑒別器的批次將包括一半真實點和一半假(生成的)點
half_batch = int(n_batch / 2)
#我們使用手動方式枚舉世代( epochs )
for i in range(n_epochs):
#訓練鑒別器
#準備真實樣品數(shù)據(jù)
x_real, y_real = real_samples(half_batch)
#準備假(生成)樣本數(shù)據(jù)
x_fake, y_fake = fake_samples(g_model, latent_dim, half_batch)
# 使用真實和虛假樣本訓練鑒別器
d_model.train_on_batch(x_real, y_real)
d_model.train_on_batch(x_fake, y_fake)
#生成器訓練
# 從潛在空間中獲取用作生成器輸入的點
x_gan = latent_points(latent_dim, n_batch)
# 當我們生成假樣本時,我們希望GAN生成器模型創(chuàng)建與真實樣本相似的樣本
# 因此,我們希望傳遞與真實樣本對應的標簽,即y=1,而不是0。
y_gan = np.ones((n_batch, 1))
# Train the generator via a composite GAN model
gan_model.train_on_batch(x_gan, y_gan)
# Evaluate the model at every n_eval epochs
if (i) % n_eval == 0:
performance_summary(i, g_model, d_model, latent_dim)

如前所述,我們通過傳遞一批50%真實和50%虛假(生成)的樣本數(shù)據(jù)來分別訓練鑒別器。同時,生成器訓練通過組合的GAN模型進行。

實驗結果

讓我們調(diào)用訓練函數(shù)來顯示一些上述實驗的結果:

# 訓練GAN模型
train(gen_model, dis_model, gan_model, latent_dim)

下圖展示的是在世代(epoch)0時期輸出的結果:

世代0完成后的GAN性能

在世代3,000時期輸出的結果:

在世代3,000完成后輸出的結果

在世代10,000時期輸出的結果:

在世代10,000完成后輸出的結果

我們可以看到生成器在每一步都得到了改進。然而,在經(jīng)歷了10000個世代之后,鑒別器仍然表現(xiàn)良好,能夠識別大多數(shù)真實樣本和大部分虛假(生成)樣本。因此,我們可以繼續(xù)將該模型訓練到下一個10000個世代,以取得更好的結果。比較上述模型性能的另一種方法是查看真實和虛假點分布的匯總統(tǒng)計結果:

# 生成1000個偽樣本數(shù)據(jù)
x_fake, y_fake = fake_samples(gen_model, latent_dim, 1000)
df_fake = pd.DataFrame(x_fake, columns=['x dimension', 'y dimension'])
# 1000個真實的樣本數(shù)據(jù)點
x_real, y_real = real_samples(1000)
df_real = pd.DataFrame(x_real, columns=['x dimension', 'y dimension'])
#顯示匯總統(tǒng)計結果
print("Distribution statistics of fake (generated) points")
print(df_fake.describe())
print("----------------------------------------")
print("Distribution statisticss of real points")
print(df_real.describe())

真實和虛假(生成)點分布統(tǒng)計的比較

上述實驗數(shù)據(jù)清楚地表明了:分布差異相對較小。

7.結語 

我希望閱讀完本文后,你能夠很好地理解了Gan 網(wǎng)絡的工作原理。

譯者介紹

朱先忠,社區(qū)編輯,專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。早期專注各種微軟技術(編著成ASP.NET AJX、Cocos 2d-X相關三本技術圖書),近十多年投身于開源世界(熟悉流行全棧Web開發(fā)技術),了解基于OneNet/AliOS+Arduino/ESP32/樹莓派等物聯(lián)網(wǎng)開發(fā)技術與Scala+Hadoop+Spark+Flink等大數(shù)據(jù)開發(fā)技術。

原文鏈接:https://towardsdatascience.com/gans-generative-adversarial-networks-an-advanced-solution-for-data-generation-2ac9756a8a99


文章名稱:生成性對抗網(wǎng)絡——數(shù)據(jù)生成的高級解決方案
當前路徑:http://www.5511xx.com/article/dhcdghe.html