TensorFlow 實戰:Neural Style

發表於2017-06-21

 

1802816598-5944fdf3c46d5_articlex

Neural Style是一個非常有意思的深度學習應用:輸入一張代表內容的圖片和一張代表風格的圖片,深度學習網路會輸出一張融合了這個風格和內容的新作品。

TensorFlow是Google開源的最流行的深度學習框架。作者anishathalye使用TensorFlow實現了Neural Style,並將其開源放在了GitHub上。本文對他的程式碼進行深入剖析。程式碼請點這裡

Pretrained VGG-19 Model

VGG在2014年的 ILSVRC localization and classification 兩個問題上分別取得了第一名和第二名。VGG-19是其中的一個模型,官網上提供了預先訓練好的係數,經常被業界用來做原始圖片的特徵變換。

VGG-19是一個非常深的神經網路,總共有19層,基本結構如下:

 

1553413436-5944fe086d525_articlex

前幾層為卷積和maxpool的交替,每個卷積包含多個卷積層,最後面再緊跟三個全連線層。具體而言,第一個卷積包含2個卷積層,第二個卷積包含2個卷積層,第三個卷積包含4個卷基層,第四個卷積包含4個卷積層,第五個卷積包含4個卷基層,所以一共有16個卷積層,加上3個全連線層,一共19層,因此稱為VGG-19模型。VGG-19的神經網路結構如下表所示:

4165904504-5944fe10d2f02_articlex

 

Neural Style只依賴於VGG-19的卷積層,需要使用神經網路層列舉如下:

我們可以從MatCovNet下載頁獲取VGG-19模型預先訓練好的模型係數檔案。該檔案為Matlab格式,我們可以使用Python的scipy.io進行資料讀取。

該資料包含很多資訊,我們需要的資訊是每層神經網路的kernels和bias。kernels的獲取方式是data['layers'][0][第i層][0][0][0][0][0],形狀為[width, height, in_channels, out_channels],bias的獲取方式是data['layers'][0][第i層][0][0][0][0][0],形狀為[1,out_channels]。對於VGG-19的卷積,全部採用了3X3的filters,所以width為3,height為3。注意,這裡面的層數i,指的是最細粒度的層數,包括conv、relu、pool、fc各種操作。因此,i=0為卷積核,i=1為relu,i=2為卷積核,i=3為relu,i=4為pool,i=5為卷積核,……,i=37為全連線層,以此類推。VGG-19的pooling採用了長寬為2X2的max-pooling,Neural Style將它替換為了average-pooling,因為作者發現這樣的效果會稍微好一些。

VGG-19需要對輸入圖片進行一步預處理,把每個畫素點的取值減去訓練集算出來的RGB均值。VGG-19的RGB均值可以通過np.mean(data['normalization'][0][0][0], axis=(0, 1)獲得,其取值為[ 123.68 116.779 103.939]

綜上所述,我們可以使用下面的程式碼vgg.py讀取VGG-19神經網路,用於構造Neural Style模型。

Neural Style

Neural Style的核心思想如下圖所示:

3537999093-5944fe265d6c4_articlex

 

Part 1: Content Reconstruction

基本思路如下:將content圖片p和一張隨機生成的圖片x,都經過VGG-19的卷積網路進行特徵變換,獲取某些層級輸出的特徵變換結果,要求二者的差異最小。二者在l層的損失函式定義如下:

83576422-5944fe359649d_articlex

其中F_{ij}^l為隨機圖片的第i個卷積核filter在位置j的取值,P_{ij}^l為content圖片的第i個卷積核filter在位置j的取值。

計算content圖片的feature map邏輯實現如下:

計算隨機圖片的feature map,並計算content loss的邏輯實現如下:

Part 2: Style Reconstruction

從數學上定義什麼是風格,是Neural Style比較有意思的地方。每個卷積核filter可以看做是圖形的一種特徵抽取。風格在這篇paper中被簡化為任意兩種特徵的相關性。相關性的描述使用餘弦相似性,而餘弦相似性又正比於兩種特徵的點積。於是風格的數學定義被表示為神經網路層裡filter i和filter j的點積,用G_{ij}^l表示。

3599339845-5944fe49d6a96_articlex

 

與Content Reconstruction中的損失定義相似,我們把style圖片和隨機生成的噪點圖片經過相同的VGG-19卷積網路進行特徵變換,選出指定層級的filters。對每個層級,計算兩張圖片特徵變換後$G_{ij}^l$的差異。

2699247720-5944fe55e7af4_articlex

 

各個層級的加權和就是最後的style loss:

2283658494-5944fe5cc2b16_articlex

計算style圖片的feature map邏輯實現如下:

計算隨機圖片的feature map,並計算style loss的邏輯實現如下:

將上述程式碼有序組合在一起後,可以得到Neural Style TensorFlow程式碼的第二個關鍵檔案stylize.py

參考資料

相關文章