神經風格遷移指南(第一部分)

AI研習社2018-11-29 20:03:48

本文為 AI 研習社編譯的技術博客,原標題 :

Neural Style Transfer Tutorial -Part 1

作者 | Vamshik Shetty

翻譯 | 楊惠淳、nanly、老趙    

校對 | 醬番梨        整理 | 菠蘿妹

原文鏈接:

https://towardsdatascience.com/neural-style-transfer-tutorial-part-1-f5cd3315fa7f

注:本文的相關鏈接請點擊文末【閱讀原文】進行訪問


神經風格遷移指南 - 第一部分

  神經風格遷移學說

在本系列中,我們會從神經風格的基礎開始,你將從中學到一種自下而上(從基礎開始)的方法。對於初學者而言,我們將會詳細講解神經風格到底是什麼,以及它的工作原理。本文是連載中的系列文章的第一部分,將由我與 Pawan Sasanka Ammanamanchi 共同完成。本系列長期連載,我們將努力覆蓋這個領域的研究,並且不斷增加新的文章。目前,實現這一目標的先決條件如下:

  1.  Python

  2. 基本理解卷積神經網絡的工作原理.如果你對這些知識(卷積神經網絡)不是很瞭解,我們建議你看一下這篇文章卷積神經網絡.

那麼,風格遷移是什麼意思呢?

在過去幾年裡,有一些APP湧現出來,例如Prisma等等,可以把照片風格化,看起來就像是一幅畫一樣。這些為你提供非常多漂亮的藝術風格,就像是梵高所畫的《星夜》。讓我用文字來闡釋背後的原理其實是不容易的。

圖1

如同你在圖一中看到的,兩張圖片一張是負責提供內容的,另一張是負責提供圖像風格的,這兩張用來生成一張全新的圖片,這張圖就被稱為經過風格化的圖片。關於這張圖片有一些需要注意的地方,這張圖片在保留了原有內容的基礎上融合了風格圖的特色。新的圖片看上去很棒,並且我們可以十分確定這不是簡單的將兩張圖片重疊起來得到的。那麼問題就在於我們是如何實現的,這背後又使用了哪些數學理論。要回答這個問題,我們需要先退後一步,思考下別的問題,卷積神經網絡學習到的到底是什麼?這些卷積層以特徵圖或者卷積核形式進行編碼的到底是什麼?我們輸入一張圖片的時候,卷積網絡學習到了什麼表徵?讓我們先來搞清楚這些問題。

卷積神經網絡最初被設計用來進行圖片分類工作,最近它也被應用到了其他諸如圖片分割,圖像風格遷移及其他有關計算機視覺方面的任務上,當然也有被用於自然語言處理的例子。卷積神經網絡是深度學習中最能夠被解釋的模型之一,因為我們可以將他們的表徵可視化從而理解他們可能學到的東西。

我們能從卷積神經網絡中得到什麼啟發呢?

這一部分我想分享一些直觀的關於卷積神經網絡的深度層如何表示一張圖片,同時我們又是如何使用這些只對模型有意義的表徵來進行圖像風格遷移的。我們就用這個VGG16結構來理解隱藏層中的表徵。


圖2

使用上述架構作為參考,讓我們考慮vgg16的第一個卷積層,它使用3x3內核並訓練64個特徵映射,通過將大小為224x224的3通道圖像作為輸入來生成224x224x64的圖像表示。 如果你有點困惑,請看下面:

圖3

讓我們假設在訓練這64個特徵圖時,它們可能已經學會了檢測簡單模式,這樣一些神經元在看到一條直線時會激活,或者甚至是某些其他類型的模式,這樣一些神經元在他們看到一條直線時會激活,或者甚至會出現一些其他類型的圖案,這些圖案可能對人眼沒有任何意義,但對這個模型有很大的價值。直線或某些模式的這種“檢測”被稱為學習特徵表示。

現在讓我們考慮vgg16的第10個卷積層,它使用帶有512個特徵映射的3x3內核進行訓練,最後生成28X28x512圖像表示的輸出,為了簡單起見,我們假設第10層中有某些單位被激活, 包含像汽車輪子的圓圈的圖像,或者可能有一些圖像被具有類似於三條相交線等的圖案的圖像激活。

圖4-卷積網絡可視化和理解

可以安全地假設 CNN 沒有學會編碼什麼圖像,但它實際上學習編碼圖像代表什麼或圖像中可見的內容,並且由於神經網絡的固有非線性特性,我們從淺層到更深層的隱藏單元能夠從給定圖像中檢測出越來越複雜的特徵。

這些圖像表示如何幫助進行風格轉換?

那麼編碼表示本身的這種性質是風格轉移的關鍵,它用於計算生成的圖像與內容和樣式圖像之間的損失。由於每個類在數萬個圖像上訓練模型,因此模型能夠為許多不同的圖像生成相似的特徵表示,因為它們屬於同一類或具有相似的內容或樣式。因此,使用生成的圖像的特徵表示的值與內容和樣式圖像的差異來指導我們生成生成的圖像本身的迭代是有意義的但是我們如何確保內容圖像(C)和生成的圖像(G )在內容方面是相似的而不是風格,而另一方面,我們如何確保生成的圖像僅從樣式圖像(S)繼承類似的樣式表示而不是整個樣式圖像本身。這可以通過將損失函數分為兩部分來解決,一部分是內容損失,另一部分是風格損失,很快我們就會理解它們彼此之間的差異以及它們如何克服我們提出的問題。


  損失函數


圖5

正如在上面的等式中所看到的,我們需要計算兩件事來獲得整體損失,即內容損失和風格損失,alpha 和 beta 超參數用於為每種類型的損失提供權重,即這些參數可以被簡單認為是作為旋鈕來控制我們想要在生成的圖像中繼承多少內容/風格。 因此,讓我們瞭解每個損失術語的含義。

上面顯示的此損失函數的輸入是什麼? 我們不知道最終輸出的外觀。 因此,監督學習的樸素方法可能行不通。 答案在於下圖。

圖6-用於內容,風格和生成圖像的不同表示

在每次迭代期間,所有三個圖像,即內容圖像,風格圖像和生成圖像都通過vgg16模型。 在某些層上對給定圖像的特徵表示進行編碼的隱藏單元的激活值被視為這些損失函數的輸入,簡單來說,你可以直接將其視為在VGG16網絡中獲取圖層的輸出, 關於選擇圖層的任何硬性規則。 在這裡注意另一件事,最初我們隨機初始化生成的圖像,如果你看它然後它只不過是一個形狀與內容圖像相同的隨機噪聲矩陣。 每次迭代我們都會更改生成的圖像,以儘量減少總體損失L。

注意:在每個卷積層之後,它的輸出通過 relu 作為激活函數傳遞,你也可以在圖2中查看每個卷積塊被表示為 [Convolution + Relu]。


內容損失

內容損失很容易計算,讓我們只考慮其中一個層的特徵表示,讓我們考慮vgg16的第7個卷積層。 為了計算內容損失,我們通過vgg16傳遞內容圖像和生成的圖像,並獲得這些圖像的第7個轉換層的激活值(即輸出),這些圖像用 Relu 激活,我們將該圖層的輸出通常表示為 relu_3_3,因為 它是第三組/第三組卷積的第三轉換層的輸出(參見圖2和圖6以供參考)。 最後,我們發現這兩個激活矩陣之間的元素減法的 L2 範數,這將有助於通過確保最小化特徵表示的差異來保持所生成圖像中的原始內容,所述特徵表示在邏輯上集中於兩個圖像的內容之間的差異。

把這種損失用在數學形式或我們可以計算的方程中。 假設我們有函數內容損失,它接受三個參數作為輸入,即內容圖像 C ,生成的圖像 G 和層 L,其激活我們將用於計算損失。 現在讓我們將內容圖像的每個激活層表示為 [L](C)並將生成的圖像的激活層表示為 [L](G)。


圖7

風格損失

現在讓我們看一下風格損失,在計算風格損失時,我們將考慮從模型的淺層到更深層的許多卷積層的特徵表示。 與內容損失不同,我們不能僅僅找到激活單元的差異,我們需要的是在同一層的不同通道中找到這些激活之間的相關性的方法,為此我們需要一些稱為Gram Matrix的東西。

什麼是Gram矩陣?

我將嘗試用一個例子來構建理解 gram 矩陣所需的基礎,所以讓我們考慮通過 vgg16 傳遞我們的風格圖像,我們從第7層獲得激活值,生成大小為56x56x256 的特徵表示矩陣,你可以參考圖2描述的 vgg16 的體系結構。 現在讓我們仔細看看這個輸出。

圖8

在這個3-D陣列中,有256個通道,每個通道大小為56x56。 現在讓我們假設有一個通道 'A',當它們遇到包含黑色和棕色條塊的圖像區域時,它們的激活單元可能被激活,然後有一個通道 'B',當它們遇到類似眼球的東西時,它們的激活單元可能被激活。

注意:這裡激活的單位指的是它們在通過 relu 之後具有相當大的值而不是零。

如果這兩個通道 'A' 和 'B' 同時為相同的輸入激活,則圖像可能包含虎臉(因為它有兩個高值的通道,可激活眼球和棕黑色條紋)。 現在,如果這兩個通道都以高激活值啟動,這意味著它們與通道 'A' 和 'C' 之間的相關性相比具有高相關性,其中通道 'C' 可能在看到菱形圖案時被激活。 這個想法背後的邏輯是兩個大數的乘法是大的,而兩個小數或大數和小數的乘法相對較小。 所以相關性告訴我們這些高級紋理/圖案中的哪一個發生或不發生在一起。

因此,為了獲得所有這些通道的相互關係,我們需要計算一些稱為 gram矩陣的東西,我們將使用 gram 矩陣來測量通道之間的相關程度,這些通道隨後將作為風格本身的度量。 現在你可能已經理解了 gram 矩陣的重要性,但是要理解我們如何得到上述三維數組的 gram 矩陣,請通過下面提到的圖像。

圖9- Gram 矩陣 G

現在你可以看到這個 gram 矩陣的每個元素如何包含所有通道相對於彼此的相關性度量。 接下來,我們如何使用這個計算的 Gram 矩陣 G 來計算風格損失。 讓我們將層 L 的風格圖像的 gram 矩陣表示為GM [L](S),並將生成圖像的 gram 矩陣表示為 GM [L](G)。 gram 矩陣都是從同一層計算的,因此使用相同數量的通道使其成為大小為 ch x ch 的矩陣。現在,如果我們找到這兩個矩陣的元素減法的平方差或 L2_norm 的總和,並嘗試最小化 。然後,這最終將導致最小化風格圖像樣式和生成圖像之間的差異。 想一想,它可能需要一些時間來解決,但是當它確實存在時,你會被這簡單而有效所迷惑。

圖10-單層 L 的風格損失

在上面的等式中,N 下標 l 表示層1的特徵圖/輸出中的通道數,M 下標 l表示層1的特徵圖/輸出的高度*寬度。

在計算風格損失時,我們使用多個激活層,這種情況使我們有可能為不同層提供的每個子損失分配不同的權重。 在下面的等式中,總結我剛才所說的,但在我們的情況下或大多數情況下,一般人們給予所有層次相同的權重。

圖11

下一步是什麼 ?

一旦你有內容和風格損失,前向移動就會添加它們並使用任何優化器來執行梯度下降來更改生成圖像,以便在每次迭代後減少它的損失。

這幾乎總結了一下,我希望我的解釋足以消除你對神經風格基礎的疑慮。 現在你可以深入研究神經風格的代碼,我將瀏覽我的代碼的每一行並正確地剖析它,但是下面提到的偽代碼幾乎總結了你將要運行和使用的代碼。

原始論文通常使用以下內容和風格圖層,但你也可以嘗試其他圖層。

這是神經風格的本質。 如果你對本文的任何部分仍有疑問或想要更好的解釋,請在下面發表評論,我會盡儘快回覆你。

學習快樂。


原始神經風格轉移的鏈接:Leon A. Gatys“藝術風格的神經算法”。

你可以期待以下文章。

使用Tensorflow和pyTorch進行神經風格轉換的課程:

       第1部分 - 神經風格轉移理論

       第2部分 - 神經風格轉移的實施

       第3部分 - 快速神經風格轉移的實現

       第4部分 - 深度照片

       第5部分 - 人臉神經風格轉換理論

       第6部分 - 面部神經風格轉移的實現

感謝閱讀本文。


想要繼續查看該篇文章相關鏈接和參考文獻?

長按鏈接點擊打開或點擊底部【閱讀原文】:

http://ai.yanxishe.com/page/TextTranslation/1215


AI研習社每日更新精彩內容,觀看更多精彩內容:

機器學習 2019:AI 發展趨勢分析

使用 SKIL 和 YOLO 構建產品級目標檢測系統

谷歌開源BERT不費吹灰之力輕鬆訓練自然語言模型

使用 Tensorflow 完成簡單的強化學習 Part 1:好奇心驅動的學習


等你來譯:

如何用PyTorch訓練圖像分類器 

掌握機器學習必須要了解的4個概念 

給你的電腦做個簡單的“人臉識別認證”

取得自然語言處理SOA結果的分層多任務學習模型(HMTL) 


獨家中文版 CMU 秋季深度學習課程免費開學!

CMU 2018 秋季《深度學習導論》為官方開源最新版本,由卡耐基梅隆大學教授 Bhiksha Raj 授權 AI 研習社翻譯。學員將在本課程中學習深度神經網絡的基礎知識,以及它們在眾多 AI 任務中的應用。課程結束後,期望學生能對深度學習有足夠的瞭解,並且能夠在眾多的實際任務中應用深度學習。

↗掃碼即可免費學習↖


點擊 閱讀原文 查看本文更多內容

https://weiwenku.net/d/109661156