機器學習之光:神經風格遷移的直觀指南!
探索神經風格傳輸網路的設計選擇和技術的直觀指南
介紹
神經風格遷移(NST)是一個非常巧妙的想法。 NST的核心理念是:
在CNN中,可以將在計算機視覺任務(例如影像識別任務)中學習到的樣式表示和內容表示分離開來。
遵循這一概念,NST採用預訓練卷積神經網路(CNN)將樣式從給定影像傳遞到另一個影像。這是透過定義損失函式來完成的,該函式試圖最小化內容影像、樣式影像和生成的影像之間的差異,這將在後面詳細討論。在本教程結束時,您將能夠建立非常酷的藝術作品,如下所示。
本文的目標
本文的目的是提供一個原則性的指南,而不是對演算法進行簡單的介紹,或者用冗長乏味的程式碼扼殺讀者。特別是到本文結束時,我希望讀者能夠理解NST背後的概念,並瞭解為什麼某些事情就是這樣(例如損失函式)。作為額外的好處,讀者可以瀏覽端到端的程式碼並檢視到實際操作。
程式碼
請注意,我將僅分享文章中最重要的程式碼段。該演算法是使用TensorFlow實現的。
為何選擇NST?
深度神經網路已經超越了物體識別和檢測等任務中的人類水平表現。然而,深度網路在產生具有高感知質量的藝術品之類的任務方面還遠遠落後。使用機器學習技術創造更高質量的藝術品對於達到類似人類的能力是必要的,同時也開闢了一系列新的可能性。隨著計算機硬體的進步以及深度學習的激增,深度學習正在被用於創作藝術。例如,人工智慧生成的藝術品不會在拍賣中以高達432,500美元的價格出售。
高水平的架構
如前所述,神經樣式遷移使用預訓練卷積神經網路。然後,為了定義一個無縫融合兩個影像以建立視覺上吸引人的藝術的損失函式,NST定義了以下輸入:
- 內容影像(c) - 我們要將樣式傳遞到的影像
- 樣式影像 - 我們想要傳輸樣式的影像
- 輸入(生成)影像(g) - 包含最終結果的影像(唯一可訓練的變數)
模型的體系結構以及如何計算損失如下所示。您不需要深入瞭解下圖中的內容,因為您將在接下來的幾個部分中詳細瞭解每個元件。其思想是對在樣式轉換過程中發生的工作流進行高層次的理解。
下載並載入預先訓練的VGG-16
您將從此網頁借用VGG-16權重。您需要下載vgg16_weights.npz檔案並將其放在專案主目錄中名為vgg的資料夾中您只需要卷積和池化層。具體來說,您將載入要用作NST網路的前7個卷積層。您可以使用筆記本中給出的load_weights(...)函式執行此操作。
注意:歡迎您嘗試更多圖層。但要注意CPU和GPU的記憶體限制。
定義構建樣式傳輸網路的功能
在這裡,您可以定義幾個函式,以幫助您稍後在給定輸入的情況下完全定義CNN的計算圖。
建立TensorFlow變數
在這裡,您將載入的numpy陣列載入到TensorFlow變數中。我們將建立以下變數:
- 內容圖片(tf.placeholder)
- 風格影像(tf.placeholder)
- 生成的影像(tf.Variable和trainable = True)
- 預訓練的權重和偏差(tf.Variable and trainable = False)
確保生成的影像可訓練,同時保持預訓練的權重和偏差不變。下面我們展示兩個函式來定義輸入和神經網路權重。
計算VGG淨輸出
在這裡,您透過卷積和池化操作計算VGG淨輸出。請注意,您正在使用tf.nn.avg_pool操作替換tf.nn.max_pool,因為tf.nn.avg_pool在樣式傳輸期間提供了更好的視覺效果[1]。您可以透過更改下面函式中的操作來試驗tf.nn.max_pool。
損失函式
在本節中,我們定義了兩個損失函式;內容丟失功能和樣式丟失功能。內容丟失功能確保內容影像和生成的影像之間的較高層的啟用是相似的。樣式丟失功能確保樣式影像和生成的影像之間所有層中的啟用的相關性相似。我們將在下面討論詳細資訊。
內容成本函式
內容成本函式確保在生成的影像中捕獲內容影像中存在的內容。已經發現CNN捕獲關於較高階別內容的資訊,其中較低階別更關注於各個畫素值[1]。因此,我們使用最頂層的CNN層來定義內容丟失功能。
設A ^ l_ {ij}(I)啟用第l層,第i個特徵圖和使用影像I獲得的第j個位置。然後將內容丟失定義為損失,
基本上L_ {content}捕獲由生成的影像和內容影像產生的啟用之間的均方根誤差。但是,為什麼最小化較高層啟用之間的差異可以確保保留內容影像的內容?
內容損失背後的直覺
如果您視覺化神經網路學到的內容,則有證據表明在不同物件存在的情況下,更高層中的不同要素圖被啟用。因此,如果兩個影像都具有相同的內容,則它們應該在較高層中具有類似的啟用。
我們可以這樣定義內容成本。
風格損失函式
定義樣式損失函式需要更多工作。為了從VGG網路中提取樣式資訊,我們使用CNN的所有層。此外,樣式資訊被測量為給定層中的特徵圖之間存在的相關量。接下來,將損失定義為由生成的影像計算的特徵圖與樣式影像之間存在的相關性的差異。在數學上,風格損失定義為,
w ^ l(在本教程中選擇的均勻)是在損失計算期間給予每個層的權重,並且M ^ l是取決於第l層的大小的超引數。但是在此實現中,您沒有使用M ^ l,因為在定義最終損失時,它將被另一個引數定義最終的損失。
風格損失背後的直覺
雖然上面的方程組比較複雜,但這個想法相對簡單。目標是為生成的影像和樣式影像計算樣式矩陣(下面視覺化)。然後將樣式損失定義為兩個樣式矩陣之間的均方根差。
下面您可以看到如何計算樣式矩陣的示例。樣式矩陣本質上是Gram矩陣,其中樣式矩陣的第(i,j)個元素透過計算第i和第j個特徵圖的元素乘法和寬度和高度的求和來計算。在該圖中,紅叉表示元素乘法,紅色加號表示在特徵圖的兩個寬度高度上求和。
您可以按如下方式計算樣式損失。
為什麼在Gram矩陣中捕獲該樣式?
很高興我們知道如何計算風格損失。但是你仍然沒有顯示“為什麼使用Gram矩陣計算樣式損失”。 Gram矩陣本質上是捕獲給定層中的一組特徵對映的“特徵分佈”。透過嘗試最小化兩個影像之間的樣式損失,您基本上是匹配兩個影像之間的特徵分佈[3,4]。
注意: 就個人而言,我認為上述問題的答案並不令人滿意。例如[4]解釋了風格損失和領域適應之間的相似之處。但這種關係並沒有回答上述問題。
因此,讓我更直觀地解釋一下這一點。假設您有以下功能圖。為簡單起見,我假設只有三個特徵對映,其中兩個完全不活動。您有一個要素圖集,其中第一個要素圖看起來像狗,而在第二個要素圖集中,第一個要素圖看起來像一個顛倒的狗。然後,如果您嘗試手動計算內容和樣式損失,您將獲得這些值。這意味著我們沒有丟失兩個要素圖集之間的樣式資訊。但是,內容卻完全不同。
最後的損失
最終損失定義為,
其中α和β是使用者定義的超引數。這裡β吸收了先前定義的M ^ 1歸一化因子。透過控制α和β,您可以控制注入生成影像的內容和樣式的數量。您還可以在紙張中看到不同α和β值的不同效果的視覺化。
定義最佳化器
接下來,您使用Adam最佳化器來最佳化網路的丟失。
定義輸入管道
在這裡定義完整的輸入管道。 tf.data提供了一個非常易於使用且直觀的介面來實現輸入管道。對於大多數影像處理任務,您可以使用tf.image API,但是tf.image處理動態大小影像的能力非常有限。例如,如果要動態裁剪和調整影像大小,最好以生成器的形式執行,如下所示。
您已定義了兩個輸入管道;一個用於內容,一個用於樣式。內容輸入管道查詢以單詞content開頭的jpg影像,透過樣式管道查詢以style開頭的影像。
定義計算圖
現在你已準備好搖滾!在本節中,您將定義完整的計算圖。
- 定義提供輸入的迭代器
- 定義輸入和CNN變數
- 定義內容、風格和總損失
- 定義最佳化操作
跑步風格遷移
是時候執行計算圖並生成一些藝術作品了。生成的圖稿將儲存到data / gen_0,data / gen_1,...,data / gen_5等資料夾中。s
當你執行上面的程式碼時,你應該得到一些整潔的藝術儲存到你的磁碟,如下所示。
結論
在本教程中,您瞭解了神經樣式遷移。神經樣式遷移允許將兩個影像(一個包含內容和一個包含樣式)混合在一起以建立新的藝術。您首先了解了為什麼需要神經風格遷移以及方法體系結構的概述。然後,您使用TensorFlow定義了神經樣式傳輸網路的細節。具體來說,您定義了幾個函式來定義變數/輸入,計算VGG輸出,計算損耗並執行最佳化。接下來你理解了兩個讓我們實現我們想要的東西的損失;詳細的內容損失和風格損失,看他們如何聚集在一起來定義最終的損失。最後,您執行模型並檢視由模型生成的圖稿。
本教程的程式碼可在此處獲得。()
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2564398/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 暢談人工智慧藝術新命題:神經風格遷移人工智慧
- 機器學習開源框架系列:Torch:3:影像風格遷移機器學習框架
- 吳恩達《卷積神經網路》課程筆記(4)– 人臉識別與神經風格遷移吳恩達卷積神經網路筆記
- Flora影象風格遷移AppAPP
- 神經網路的直觀解釋(轉載)神經網路
- [譯] TensorFlow 教程 #15 – 風格遷移
- Android 端影象多風格遷移Android
- 深度有趣 | 30 快速影象風格遷移
- 影像風格遷移(Neural Style)簡史
- [譯] TensorFlow 教程 #15 - 風格遷移
- 神經風格遷移:使用 tf.keras 和 Eager Execution,藉助深度學習創作藝術作品Keras深度學習
- 英偉達再出GAN神作!多層次特徵的風格遷移人臉生成器特徵
- android中的深度學習——快速風格遷移Android深度學習
- AI繪畫第二彈——影象風格遷移AI
- JS 風格指南JS
- JavaScript風格指南JavaScript
- 《深度學習——Andrew Ng》第四課第四周程式設計作業_2_神經網路風格遷移深度學習程式設計神經網路
- Python+OpenCV 影象風格遷移(模仿名畫)PythonOpenCV
- Perceptual Losses 風格遷移論文復現小記
- 部落格遷移
- Gram格拉姆矩陣在風格遷移中的應用矩陣
- 如何用Keras打造出“風格遷移”的AI藝術作品KerasAI
- Json風格指南JSON
- Google JavaScript 風格指南GoJavaScript
- Python 超簡單實現 9 種影像風格遷移Python
- BAIR提出MC-GAN,使用GAN實現字型風格遷移AI
- 讀“基於深度學習的影像風格遷移研究綜述”有感深度學習
- webpack 4遷移指南Web
- 「川言川語」:神經網路RNN模仿川普的語言風格神經網路RNN
- JavaScript編碼風格指南JavaScript
- RayWenderlich 官方 Swift 風格指南Swift
- JavaScript 編碼風格指南JavaScript
- Vue風格指南小結Vue
- JavaScript 程式碼風格指南JavaScript
- 機器學習整理(神經網路)機器學習神經網路
- 十、特殊應用:人臉識別和神經風格轉換
- 遷移部落格至掘金
- 用 Haskell 編寫 CEK 風格的直譯器Haskell