當前位置:
首頁 > 最新 > 從0開始,手把手教你學會最火的神經網路

從0開始,手把手教你學會最火的神經網路

安妮 編譯自 O』Reilly

量子位出品 | 公眾號 QbitAI

生成式對抗網路是20年來機器學習領域最酷的想法。——Yann LeCun

自從兩年前蒙特利爾大學的Ian Goodfellow等人提出生成式對抗網路(Generative Adversarial Networks,GAN)的概念以來,GAN呈現出井噴式發展。

這篇發布在O』Reilly上的文章中,作者向初學者進行了GAN基礎知識答疑,並手把手教給大家如何用GAN創建可以生成手寫數字的程序。

本教程由兩人完成:Jon Bruner是O』Reilly編輯組的一員,負責管理硬體、互聯網、製造和電子學等方面的出版物;Adit Deshpande是加州大學洛杉磯分校計算機科學專業的大二學生。Jon Bruner還對教程內容進行了視頻講解:

量子位提示:本篇文章提到的所有代碼都可以在GitHub上下載

https://github.com/jonbruner/generative-adversarial-networks

不多說了,開啟你的GAN之旅吧——

序言

GAN是一種神經網路,它會學習創建一些類似已知輸入數據的合成數據。目前,研究人員已經可以用GAN合成出從卧室到專輯封面等一系列照片,GAN也顯示出反映高階語義邏輯的非凡能力。

這些例子非常複雜,但構建可以生成簡單圖像的GAN真的不難。在這個教程里,我們將學習構建分析手寫數字圖像的GAN,並且從零開始學如何讓它學會生成新圖像。其實說白了,就是教會神經網路如何寫字。

上面這張圖就是我們在本教程中構建的用GAN生成的示例圖像。

GAN的架構

GAN中包含兩個模型:生成模型(Generative Model)和判別模型(Discriminative Model)。

判別模型是一個分類器,它判斷給定的圖片到底是來自數據集的真實圖像,還是人工創建的假圖像。這基本上就是一個表現為卷積神經網路(CNN)形式的二元分類器。

生成模型通過反卷積神經網路將隨機輸入值轉化為圖像。

在數次訓練迭代的歷程中,判別器和生成器的的權重和偏差都是通過反向傳播訓練的。判別器學習從一堆生成器生成的假數字圖像中,找出真正的數字圖像。與此同時,生成器通過判別器的反饋學習如何生成具有欺騙性的圖片,防止被判別器識別出來。

準備工作

我們將創造一個可以生成手寫數字的GAN,希望可以騙過最好的分類器(當然也包括人類)。我們將使用谷歌開源的TensorFlow使在GPU上訓練神經網路更容易。

TensorFlow下載地址:

https://www.tensorflow.org/

在學習這個教程之前,希望你可以了解一些TensorFlow的知識。如果之前沒有接觸過它,建議你先看看相關的文章和教程。

載入MNIST數據

首先,我們需要給判別器輸入一系列真實的手寫數字圖像,算是給判別器的一個參考。這裡使用的是深度學習基準數據集MNIST,這是一個手寫數字圖片資料庫,每一張都是0-9的單個數字,且每一張都是抗鋸齒(Anti-aliasing)的灰度圖。資料庫中包含美國國家標準與技術研究所收集的人口調查局員工和高中生寫的70000張數字圖像。

MNIST數據集鏈接(英文):

http://yann.lecun.com/exdb/mnist/

我們從導入TensorFlow和其他有用的資料庫開始講起。首先我們需要用TensorFlow的便捷函數導入MNIST的圖像,不妨把這個函數稱為read_data_sets。

我們創造的MNIST的變數包含圖像和標籤,並將數據集分為訓練集和驗證集(不過在本教程里我們並不需要考慮標籤這個事情)。我們可以通過調用mnist上的next_batch進行檢索,現在我們先載入一張圖片看看。

這張圖像一開始被格式化為一列784像素,我們可以將它們改造成28×28像素的圖像並且用PyPlot查看。

如果你再次運行上面的cell,你會發現和MNIST訓練集不同的圖像。

判別網路

判別器是一個卷積神經網路,接收圖片大小為28×28×1的輸入圖像,之後返還一個單一標量值來描述輸入圖像的真偽——判斷到底是來自MNIST圖像集還是生成器。

判別器的結構與TensorFlow的樣例CNN分類模型密切相關。它有兩層特徵為5×5像素特徵的卷積層,還有兩個全連接層按圖像中每個像素計算增加權重的層。

創建了神經網路後,通常需要將權重和偏差初始化,這項任務可以在tf.get_variable中完成。權重在截斷正態分布中被初始化,偏差在0處被初始化。

其實上面這些就是一個普通簡單的二進位分類器,如果你不是初次接觸CNN,應該對此並不陌生。

定義了判別器之後,我們需要回頭看看生成模型。我們將以Tim O』Shea編寫的簡單生成器代碼為基礎構建模型的整體結構。

Code鏈接:

https://github.com/osh/KerasGAN

其實你可以把生成器想像成反向卷積神經網路的一種。判別器就是一個典型的CNN,它能將二維或三維的像素值矩陣(matrix of pixel values)轉化成一個概率。然而作為一個生成器,需要d-維度向量 d-dimensional vector ,並需要將其變為28*28的圖像。ReLU和批量標準化(batch normalization)也經常用於穩定每一層的輸出。

在這個神經網路中,我們用了三個卷積層和插值,直到形成28*28像素的圖像。

我們在輸出層添加了一個tf.sigmoid() 激活函數,它將擠壓灰色呈現白色或黑色相,從而產生一個更清晰的圖像。

生成樣本圖像

定義完生成器和判別函數,我們現在看看沒有訓練過的生成器會生成怎樣的樣例。

接下來需要將所有變數初始化,將z_batch 放到佔位符中,並運行這部分代碼。

sess.run()函數有兩個參數。第一個叫做「獲取」參數,定義你在計算中感興趣的值。在這個案例中,我們想看到生成器會輸出什麼。如果看看最後的代碼片段,你將看到生成函數的輸出被存儲在generated_image_output里,我們將使用generated_image_output作為第一個參數。

第二個參數相當於一個輸入字典,在運行時可以取代計算圖,也就是我們要填到佔位符里的。在我們的例子中,我們需要將z_batch變數輸入到之前定義的z_placeholder中,之後在PyPlot中將圖片重新調整為28*28像素。

它看起來像噪音對吧。現在我們需要訓練生成網路中的權重和偏差,將隨機數轉變為可識別的數字。我們再看看損失函數和優化。

訓練GAN

構建和調試GAN就複雜在它有兩個損失函數:一個鼓勵生成器創造出更好的圖像,另一個鼓勵判別器區分哪個是真圖像,哪個是生成器生成的。

我們同時訓練生成器和判別器,當判別器能夠很好區分圖像來自哪裡時,生成器也能更好地調整它的權重和偏差來生成更以假亂真的圖像。

這個網路的輸入和輸出如下:

sigmoid_cross_entropy_with_logits 是在未縮放的值下運行的,而不是在0到1之間的概率值。看一下判別器的最後一行:這裡並沒有softmax或sigmoid函數層。如果判別器「飽和」了,或者有足夠的信心可以在給出生成圖像後返回0,那麼就會使判別器的梯度下降失去作用。

tf.reduce_mean()函數選取的是交叉熵函數返回的矩陣中所有分量的平均值。這是一種將損失減小到單個標量值的方法,而不是向量或矩陣。

現在我們來設置生成器的損失函數。我們想讓生成網路的圖像騙過判別器:當輸入生成圖像時,判別器可以輸出接近1的值,來計算Dg與1之間的損失。

現在我們已經得到損失函數,需要定義優化程序了。生成網路的優化程序只需要升級生成器的權重,而不是判別器的。同樣的,當訓練判別器的時候,我們需要固定生成器的權重。

為了使這些看起來不同,我們需要創建兩個變數列表,一個是判別器的權重和偏差,另一個是生成器的權重和偏差。這就是當給TensorFlow變數取名字需要深思熟慮的原因。

下一步,你需要制定兩個優化器,我們一般選擇Adam優化演算法,它利用了自適應學習速率和動量。我們調用Adam最小函數並且指定我們想更新的變數——也就是我們訓練生成器時的生成器權重和偏差,和我們訓練判別器時的判別器權重和偏差。

我們為判別器設置了兩套不同的訓練方案:一種是用真實圖像訓練判別器,另一種是用生成的「假圖像」訓練它。有時使用不同的學習速率很有必要,或者單獨使用它們來規範學習的其他方面。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 量子位 的精彩文章:

DeepMind新論文:基於變分方法的自編碼生成對抗網路
Bengio創立的公司A輪融資1億美元,英偉達和英特爾攜手參投
Facebook讓AI學會談判協商,能通過「說謊」達到目的
DeepMind說機器推理水平能超人類,現在有人把代碼搞出來了
影響無人駕駛技術未來發展的六大趨勢

TAG:量子位 |

您可能感興趣

下腰姿勢很好看 手把手教你學會
手把手教你做蜜汁叉燒,學會了再也不用去粵菜餐廳了!
最好的愛是學會放手
手把手教你學會PS調色
編髮達人手把手教你學編髮,手殘黨也能輕鬆學會!
小米槍戰:新手必須學會的4個技巧,高手進階之路必備!
最讓人棘手的眼線,6+1技巧就包你學會!
1歲大寶寶剛學會走路,卻必須進行截肢手術,看著讓人心碎
眼線總是畫不好?手把手教你,3分鐘學會!
學會走路的豬
《尋仙》手游:學會這麼干 讓你師德拿到手軟
手把手教你做香濃湯,學會了絕對可以燉的奶白!
手把手叫你韓系果汁眼妝輕鬆get,3分鐘手殘星人也能學會
新手健身,學會多些技巧,少走彎路!
訓鸚鵡4技!學會了,你就是訓鳥高手
從超高顏值的手賬開始,學會與自己對話
教你在家做曲奇餅乾,烘焙新手也能學會
鉤花教程,用來做裝飾很美,新手也能輕鬆學會!
終於學會手倒立
中醫手把手教你認9個「養生穴」,學會了你也是老中醫