1. 程式人生 > >GAN網路之入門教程(三)之DCGAN原理

GAN網路之入門教程(三)之DCGAN原理

[TOC] 如果說最經常被用來處理影象的網路模型,那麼毋庸置疑,應該是CNN了,而本次入土教程的最終目的是做一個動漫頭像生成的網路模型,因此我們可以將CNN與GAN結合,也就是組成了傳說中的DCGAN網路。 ## DCGAN簡介 DCGAN全稱[Deep Convolutional Generative Adversarial Networks](https://arxiv.org/pdf/1511.06434.pdf),中文名曰深度卷積對抗網路。論文地址在[這裡](https://arxiv.org/pdf/1511.06434.pdf)。 因為DCGAN是不僅與GAN有關還與CNN有關,因此,如果不是很瞭解的CNN的話,建議先去看一看CNN相關的知識,也可以參考一下我以前的部落格。 - [資料探勘入門系列教程(十一點五)之CNN網路介紹](https://www.cnblogs.com/xiaohuiduan/p/12812288.html) - [資料探勘入門系列教程(十二)之使用keras構建CNN網路識別CIFAR10](https://www.cnblogs.com/xiaohuiduan/p/12813368.html) 這裡我們可以在複述一下CNN的相關知識和特點。 CNN我們可以理解為如下的行為,逐層深入"抽絲剝繭”地“理解”一張圖片或其他事物。圖片經過CNN網路中的一系列layer,逐漸的對影象進行細化,最終將影象從一個大的維度變成一個小的維度。在DCGAN中,**判別器**實際上就是一個CNN網路。輸入一張圖片,然後輸出yes or no的概率。 ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142051390-1415688521.png) 而在DCGAN中,$G$網路的模型是怎麼樣的?$G$網路剛好和CNN相反,它是由noise通過$G$網路生成一張圖片,因為圖片通過layer逐漸變大,與卷積作用剛好相反——因此我們可以稱之為**反捲積**。 ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142051998-322116707.png) ## DCGAN的特點 當然,DCGAN除了$G$網路與CNN不同之外,它還有以下的不同: 1. 取消所有pooling層。G網路中使用轉置卷積(transposed convolutional layer)進行上取樣,D網路中用加入stride的卷積代替pooling。 2. 除了生成器模型的輸出層和判別器模型的輸入層,在網路其它層上都使用了Batch Normalization,使用BN可以穩定學習,有助於處理初始化不良導致的訓練問題。 3. G網路中使用ReLU作為啟用函式,最後一層使用tanh 4. D網路中使用LeakyReLU作為啟用函式 ## 幾個重要概念 為了能夠繼續瞭解DCGAN,我們還是得需要準備一下幾個重要概念。 ### 下采樣(subsampled) 下采樣實際上就是縮小影象,主要目的是為了使得影象符合顯示區域的大小,生成對應影象的縮圖。比如說在CNN中得池化層或卷積層就是下采樣。不過卷積過程導致的影象變小是為了提取特徵,而池化下采樣是為了降低特徵的維度。 ### 上取樣(upsampling) 有下采樣也就必然有上取樣,上取樣實際上就是放大影象,指的是任何可以讓影象變成更高解析度的技術,這個時候我們也就能理解為什麼在$G$網路中能夠由噪聲生成一張圖片了。 它有反捲積(Deconvolution)、上池化(UnPooling)方法。這裡我們只介紹反捲積,因為這是是我們需要用到的。 ### 反捲積(Deconvolution) 反捲積(Deconvolution)也稱為分數步長的卷積和**轉置卷積(transposed convolution)**。在下圖中,左邊的為卷積,右邊的為反捲積。**convolution**過程是將**4×4**的影象對映為**2×2**的影象,而反捲積過程則是將**2×2**的影象對映為**4×4**的影象,兩者的kernel size均為3。不過顯而易見,反捲積只能恢復圖片的尺寸大小,而不能準確的恢復圖片的畫素值(此時我們想一想,在CNN中,卷積層的kernel我們可以學習,那麼在反捲積中的kernel我們是不是也可以學習呢?)。 ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142052548-1574172421.gif) 關於更多的我就不做更多的講解了,大家可以參考別人的部落格進行學習。 ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142053192-1980827365.gif) ### 批標準化(Batch Normalization) 推薦大家去看看[什麼是批標準化 (Batch Normalization)](https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-13-A-batch-normalization/),通俗易懂。在下圖中,我們可以看到,當$x_2 = 20$的時候,$tanh(wx_2) = 0.96$,已經比較接近於1,如果繼續增大$x$,$tanh(wx)$也不會變化太多。也就是說此時增大$x$,已經不對$x$敏感了,而這種問題即出現在輸入層也出現在隱藏層。因此,我們需要將資料進行標準化(Normalization),且不僅需要在輸入層進行這種操作,且在隱藏層也需要這種操作。Batch normalization 的 batch 是批資料, 把資料分成小批小批進行隨機梯度下降。 ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142053684-1827404393.png) BN演算法如下: ![批標準化 (Batch Normalization)](https://morvanzhou.github.io/static/results/ML-intro/NB7.png) 當然BN演算法看起來容易,實際上還是有很多複雜的東西,不過我們不做深入的探究。我們暫時只需要知道他的作用即可。 ### 啟用函式 下面是幾種常用的函式的示意圖: | 啟用函式 | ReLU啟用函式 | tanh啟用函式 | LeakyReLU啟用函式 | Sigmoid函式 | | -------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | --------------------------------------- | | 影象 | ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142053953-377753575.png) | ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142054204-1893229521.png) | ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142054444-1222976936.png) | ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142054743-619001957.png) | ## G模型 下圖是GCGAN的大體框架圖,在生成器中,使用反捲積生成影象,在判別器中使用卷積進行判別。 ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142055098-1579187625.png) 下圖是在[Deep Convolutional Generative Adversarial Networks](https://arxiv.org/pdf/1511.06434.pdf)論文中介紹的DCGAN生成器。該網路接收一個表示為z的100x1噪聲向量,通過一系列layer,最終將noise對映到64x64x3的影象中。 ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142055532-1134753331.png) 上述的過程實際上就是將一個$1 \times 100$的向量變成$64 \times 64 \times 3 $的圖片。 - Project and reshape:將$1 \times 100$通過騷操作變成$4 \times 4 \times 1024$的向量。這裡我們可以使用全連線層加捲積的方法。 - CONV:反捲積 ## 總結 以上便是DCGAN的基本原理,在下篇部落格中,將基於Keras使用DCGAN來做一個動漫頭像生成的東東。 訓練50輪過程中的gif示意圖如下: ![](https://img2020.cnblogs.com/blog/1439869/202007/1439869-20200709142056163-1673917137.gif) ### 參考 - [youtube:6.4 什麼是DCGAN](https://www.youtube.com/watch?v=i8F6fcygyy4) - [知乎:用卷積進行下采樣和池化下采樣的區別是什麼?](https://www.zhihu.com/question/307839910) - [知乎:反捲積輸出尺寸計算公式](https://zhuanlan.zhihu.com/p/57348649) - [什麼是批標準化 (Batch Normalization)](https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-13-A-batch-normalization/) - [Deep Convolutional Generative Adversarial Networks](https://arxiv.org/pdf/1511.06