丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給AI研習社
發(fā)送

0

用GAN來做圖像生成,這是最好的方法

本文作者: AI研習社 2017-08-08 17:35
導語:我們這一節(jié)我們將繼續(xù)深入 GAN,通過融合卷積神經網絡來對我們的 GAN 進行改進,實現(xiàn)一個深度卷積 GAN。

雷鋒網按:本文原作者天雨粟,原文載于作者的知乎專欄——機器不學習,雷鋒網經授權發(fā)布。

前言

在我們之前的文章中,我們學習了如何構造一個簡單的 GAN 來生成 MNIST 手寫圖片。對于圖像問題,卷積神經網絡相比于簡單地全連接的神經網絡更具優(yōu)勢,因此,我們這一節(jié)我們將繼續(xù)深入 GAN,通過融合卷積神經網絡來對我們的 GAN 進行改進,實現(xiàn)一個深度卷積 GAN。如果還沒有親手實踐過 GAN 的小伙伴可以先去學習一下上一篇專欄:生成對抗網絡(GAN)之 MNIST 數據生成。

專欄中的所有代碼都在我的 GitHub中,歡迎 star 與 fork。

本次代碼在 NELSONZHAO/zhihu/dcgan,里面包含了兩個文件:

  • dcgan_mnist:基于 MNIST 手寫數據集構造深度卷積 GAN 模型

  • dcgan_cifar:基于 CIFAR 數據集構造深度卷積 GAN 模型

本文主要以 MNIST 為例進行介紹,兩者在本質上沒有差別,只在細微的參數上有所調整。由于窮學生資源有限,沒有對模型增加迭代次數,也沒有構造更深的模型。并且也沒有選取像素很高的圖像,高像素非常消耗計算量。本節(jié)只是一個拋磚引玉的作用,讓大家了解 DCGAN 的結構,如果有資源的小伙伴可以自己去嘗試其他更清晰的圖片以及更深的結構,相信會取得很不錯的結果。

工具

  • Python3

  • TensorFlow 1.0

  • Jupyter notebook

正文

整個正文部分將包括以下部分:

- 數據加載

- 模型輸入

- Generator

- Discriminator

- Loss

- Optimizer

- 訓練模型

- 可視化

數據加載

數據加載部分采用 TensorFlow 中的 input_data 接口來進行加載。關于加載細節(jié)在前面的文章中已經寫了很多次啦,相信看過我文章的小伙伴對 MNIST 加載也非常熟悉,這里不再贅述。

模型輸入

在 GAN 中,我們的輸入包括兩部分,一個是真實圖片,它將直接輸入給 discriminator 來獲得一個判別結果;另一個是隨機噪聲,隨機噪聲將作為 generator 來生成圖片的材料,generator 再將生成圖片傳遞給 discriminator 獲得一個判別結果。

用GAN來做圖像生成,這是最好的方法

上面的函數定義了輸入圖片與噪聲圖片兩個 tensor。

Generator

生成器接收一個噪聲信號,基于該信號生成一個圖片輸入給判別器。在上一篇專欄文章生成對抗網絡(GAN)之 MNIST 數據生成中,我們的生成器是一個全連接層的神經網絡,而本節(jié)我們將生成器改造為包含卷積結構的網絡,使其更加適合處理圖片輸入。整個生成器結構如下:

用GAN來做圖像生成,這是最好的方法

我們采用了 transposed convolution 將我們的噪聲圖片轉換為了一個與輸入圖片具有相同 shape 的生成圖像。我們來看一下具體的實現(xiàn)代碼:

用GAN來做圖像生成,這是最好的方法

上面的代碼是整個生成器的實現(xiàn)細節(jié),里面包含了一些 trick,我們來一步步地看一下。

首先我們通過一個全連接層將輸入的噪聲圖像轉換成了一個 1 x 4*4*512 的結構,再將其 reshape 成一個 [batch_size, 4, 4, 512] 的形狀,至此我們其實完成了第一步的轉換。接下來我們使用了一個對加速收斂及提高卷積神經網絡性能中非常有效的方法——加入 BN(batch normalization),它的思想是歸一化當前層輸入,使它們的均值為 0 和方差為 1,類似于我們歸一化網絡輸入的方法。它的好處在于可以加速收斂,并且加入 BN 的卷積神經網絡受權重初始化影響非常小,具有非常好的穩(wěn)定性,對于提升卷積性能有很好的效果。關于 batch normalization,我會在后面專欄中進行一個詳細的介紹。

完成 BN 后,我們使用 Leaky ReLU 作為激活函數,在上一篇專欄中我們已經提過這個函數,這里不再贅述。最后加入 dropout 正則化。剩下的 transposed convolution 結構層與之類似,只不過在最后一層中,我們不采用 BN,直接采用 tanh 激活函數輸出生成的圖片。

在上面的 transposed convolution 中,很多小伙伴肯定會對每一層 size 的變化疑惑,在這里來講一下在 TensorFlow 中如何來計算每一層 feature map 的 size。首先,在卷積神經網絡中,假如我們使用一個 k x k 的 filter 對 m x m x d 的圖片進行卷積操作,strides 為 s,在 TensorFlow 中,當我們設置 padding='same'時,卷積以后的每一個 feature map 的 height 和 width 為用GAN來做圖像生成,這是最好的方法;當設置 padding='valid'時,每一個 feature map 的 height 和 width 為用GAN來做圖像生成,這是最好的方法。那么反過來,如果我們想要進行 transposed convolution 操作,比如將 7 x 7 的形狀變?yōu)?14 x 14,那么此時,我們可以設置 padding='same',strides=2 即可,與 filter 的 size 沒有關系;而如果將 4 x 4 變?yōu)?7 x 7 的話,當設置 padding='valid'時,即用GAN來做圖像生成,這是最好的方法,此時 s=1,k=4 即可實現(xiàn)我們的目標。

上面的代碼中我也標注了每一步 shape 的變化。

Discriminator

Discriminator 接收一個圖片,輸出一個判別結果(概率)。其實 Discriminator 完全可以看做一個包含卷積神經網絡的圖片二分類器。結構如下:

用GAN來做圖像生成,這是最好的方法

實現(xiàn)代碼如下:

用GAN來做圖像生成,這是最好的方法

上面代碼其實就是一個簡單的卷積神經網絡圖像識別問題,最終返回 logits(用來計算 loss)與 outputs。這里沒有加入池化層的原因在于圖片本身經過多層卷積以后已經非常小了,并且我們加入了 batch normalization 加速了訓練,并不需要通過 max pooling 來進行特征提取加速訓練。

Loss Function

用GAN來做圖像生成,這是最好的方法

Loss 部分分別計算 Generator 的 loss 與 Discriminator 的 loss,和之前一樣,我們加入 label smoothing 防止過擬合,增強泛化能力。

Optimizer

GAN 中實際包含了兩個神經網絡,因此對于這兩個神經網絡要分開進行優(yōu)化。代碼如下:

用GAN來做圖像生成,這是最好的方法

這里的 Optimizer 和我們之前不同,由于我們使用了 TensorFlow 中的 batch normalization 函數,這個函數中有很多 trick 要注意。首先我們要知道,batch normalization 在訓練階段與非訓練階段的計算方式是有差別的,這也是為什么我們在使用 batch normalization 過程中需要指定 training 這個參數。上面使用 tf.control_dependencies 是為了保證在訓練階段能夠一直更新 moving averages。具體參考 A Gentle Guide to Using Batch Normalization in Tensorflow - Rui Shu。

訓練

到此為止,我們就完成了深度卷積 GAN 的構造,接著我們可以對我們的 GAN 來進行訓練,并且定義一些輔助函數來可視化迭代的結果。代碼太長就不放上來了,可以直接去我的 GitHub 下載。

我這里只設置了 5 輪 epochs,每隔 100 個 batch 打印一次結果,每一行代表同一個 epoch 下的 25 張圖:

用GAN來做圖像生成,這是最好的方法

我們可以看出僅僅經過了少部分的迭代就已經生成非常清晰的手寫數字,并且訓練速度是非??斓?。

用GAN來做圖像生成,這是最好的方法

上面的圖是最后幾次迭代的結果。我們可以回顧一下上一篇的一個簡單的全連接層的 GAN,收斂速度明顯不如深度卷積 GAN。

總結

到此為止,我們學習了一個深度卷積 GAN,并且看到相比于之前簡單的 GAN 來說,深度卷積 GAN 的性能更加優(yōu)秀。當然除了 MNST 數據集以外,小伙伴兒們還可以嘗試很多其他圖片,比如我們之前用到過的 CIFAR 數據集,我在這里也實現(xiàn)了一個 CIFAR 數據集的圖片生成,我只選取了馬的圖片進行訓練:

剛開始訓練時:

用GAN來做圖像生成,這是最好的方法

訓練 50 個 epochs:

用GAN來做圖像生成,這是最好的方法

這里我只設置了 50 次迭代,可以看到最后已經生成了非常明顯的馬的圖像,可見深度卷積 GAN 的優(yōu)勢。


我的 GitHub:NELSONZHAO (Nelson Zhao)

上面包含了我的專欄中所有的代碼實現(xiàn),歡迎 star,歡迎 fork。

    雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

    用GAN來做圖像生成,這是最好的方法

    分享:

    編輯

    聚焦數據科學,連接 AI 開發(fā)者。更多精彩內容,請訪問:yanxishe.com
    當月熱門文章
    最新文章
    請?zhí)顚懮暾埲速Y料
    姓名
    電話
    郵箱
    微信號
    作品鏈接
    個人簡介
    為了您的賬戶安全,請驗證郵箱
    您的郵箱還未驗證,完成可獲20積分喲!
    請驗證您的郵箱
    立即驗證
    完善賬號信息
    您的賬號已經綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
    立即設置 以后再說