生成對抗網絡(GANs,https://en.wikipedia.org/wiki/Generative_adversarial_network)是一類具有基于網絡本身即可以生成數據能力的神經網絡結構。由于GANs的強大能力,在深度學習領域里對它們的研究是一個非常熱門的話題。在過去很短的幾年里,它們已經從產生模糊數字成長到創造如真實人像般逼真的圖像。
1 GAN的工作方式
GANs屬于生成模型的一類(https://en.wikipedia.org/wiki/Generative_model)。這意味著它們能夠產生,或者說是生成完全新的“有效”數據。有效數據是指網絡的輸出結果應該是我們認為可以接受的目標。
舉例說明,舉一個我們希望為訓練一個圖像分類網絡生成一些新圖像的例子。當然對于這樣的應用來說,我們希望訓練圖像越真實越好,可能在風格上與其他圖像分類訓練數據非常相似。
下面的圖片展示的例子是GANs已經生成的一系列圖片。它們看起來非常真實!如果沒人告訴我們它們是計算機生成的,我們真可能認為它們是人工搜集的。
漸進式GAN生成的圖像示例(圖源:https://arxiv.org/pdf/1710.10196.pdf)
為了做到這些,GANs是以兩個獨立的對抗網絡組成:生成器和判別器。當僅將嘈雜的圖像陣列作為輸入時,會對生成器進行訓練以創建逼真的圖像。判別器經過訓練可以對圖像是否真實進行分類。
GANs真正的能力來源于它們遵循的對抗訓練模式。生成器的權重是基于判別器的損失所學習到的。因此,生成器被它生成的圖像所推動著進行訓練,很難知道生成的圖像是真的還是假的。同時,生成的圖像看起來越來越真實,判別器在分辨圖像真實與否的能力變得越來越強,無論圖像用肉眼看起來多么的相似。
從技術的角度來看,判別器的損失即是分類圖像是真是假的錯誤值;我們正在測量它區分真假圖像的能力。生成器的損失將取決于它在用假圖像“愚弄”判別器的能力,即判別器僅對假圖像的分類錯誤,因為生成器希望該值越高越好。
因此,GANs建立了一種反饋回路,其中生成器幫助訓練判別器,而判別器又幫助訓練生成器。它們同時變得更強。下面的圖表有助于說明這一點。
生成對抗網絡的結構說明
2在PyTorch中訓練GAN來生成數字
現在我們將通過一個例子來展示如何使用PyTorch建立和訓練我們自己的GAN!MNIST數據集包含60000個訓練數據,數據是像素尺寸28x28的1-9的黑白數字圖片。這個數據集非常適合我們的用例,同時也是非常普遍的用于機器學習的概念驗證以及一個非常完備的集合。
MNIST 數據部分集,圖源:https://www.researchgate.net/figure/A-subset-of-the-MNIST-database-of-handwritten-digits_fig4_232650721
我們將從import開始,所需的僅僅是PyTorch中的東西。
import torch
from torch import nn, optim
from torch.autograd.variable import Variable
import torchvision
import torchvision.transforms as transforms
接下來,我們為訓練數據準備DataLoader。請記住,我們想要的是為MNIST生成隨機數字,即從0到9。因此,我也將需要為這10個數字建立標簽。
現在我們可以開始建立網絡了,從下面的Discriminator(判別器)網絡開始,回想一下,判別器網絡是對圖像真實與否進行分類——它是一個圖像分類網絡。因此,我們的輸入是符合標準MNIST大小的圖像:28x28像素。我們把這張圖像展平成一個長度為784的向量。輸出是一個單獨的值,表示圖像是否是實際的MNIST數字。
接下來到了生成器部分。生成器網絡負責創建實際的圖像——它可以從一個純噪聲的輸入做到這一點!在這個例子中,我們要讓生成器從一個長度為100的向量開始——注意:這只是純隨機噪聲。從這個向量,我們的生成器將輸出一個長度為784的向量,稍后我們可以將其重塑為標準MNIST的28x28像素。
- 1 . 損失函數
- 2 . 每個網絡的優化器
- 3 . 訓練次數
- 4 . batch數量



(2)接下來,我們將為生成器準備輸入向量以便生成假圖像。回想一下,我們的生成器網絡采用長度為100的輸入向量,這就是我們在這里所創建的向量。images.size(0)用于批處理大小。
(3)通過從步驟(2)中創建的隨機噪聲數據向量,我們可以繞過這個向量到生成器來生成假的圖像數據。這將結合我們從步驟1的實際數據來訓練判別器。請注意,這次我們的標簽向量全為0,因為0代表假圖像的類標簽。
(4)通過假的和真的圖像以及它們的標簽,我們可以訓練我們的判別器進行分類。總損失將是假圖像的損失+真圖像的損失。
(5)現在我們的判別器已經更新,我們可以用它來進行預測。這些預測的損失將通過生成器反向傳播,這樣生成器的權重將根據它欺騙判別器的程度進行具體更新
(5a)生成一些假圖像進行預測
(5b)使用判別器對假圖像進行分批次預測并保存輸出。
(6)使用判別器的預測訓練生成器。注意,我們使用全為1的 _real_labels_ 作為目標,因為我們的生成器的目標是創建看起來真實的圖像并且預測為1!因此,生成器的損失為0將意味著判別器預測全為1.
瞧,這就是我們訓練GAN生成MNIST圖像的全部代碼!只需要安裝PyTorch即可運行。下面的gif就是經過超過40個訓練周期生成的圖像。
審核編輯 :李倩
-
神經網絡
+關注
關注
42文章
4808瀏覽量
102821 -
圖像
+關注
關注
2文章
1092瀏覽量
41035 -
生成器
+關注
關注
7文章
322瀏覽量
21694
原文標題:你真的了解深度學習生成對抗網絡(GAN)嗎?
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論