Keras深度學習實戰(zhàn)——DeepDream模型詳解
0. 前言
在《對抗樣本生成》一節(jié)中,我們通過略微修改輸入圖像的像素值以改變模型對圖像類別的預測。在本節(jié)中,我們同樣對輸入圖像略微進行一些修改,但并不以改變圖像的標簽為目標,本節(jié)的目標是令修改后的圖像比原始圖像更具藝術感,而且能夠幫助我們理解卷積神經(jīng)網(wǎng)絡背后的機制。同時,本節(jié)所介紹算法也是我們之后將要介紹的神經(jīng)風格遷移技術的核心。
1. DeepDream 的技術原理
首先,我們先了解 DeepDream 的技術原理。在圖像識別相關博文中,我們學習了如何利用卷積神經(jīng)網(wǎng)絡進行圖像識別,利用若干卷積操作處理輸入圖像,輸入圖像類別標簽。在模型訓練階段,使用大量訓練圖像計算梯度信息,網(wǎng)絡根據(jù)梯度信息調整和學習最佳參數(shù)。
在《對抗攻擊》中,我們知道,如果想讓一張圖像被判斷為某一指定類別,可以將輸出概率作為優(yōu)化目標,不斷調整輸入圖像的像素值,讓指定類別的輸出概率盡可能大。類似的,假設我們想知道神經(jīng)網(wǎng)絡中間的卷積層究竟學到了什么,只需要最大化卷積層某一通道的輸出,由于在大多數(shù)卷積層中都包含多個通道,因此卷積的一個通道就可以代表一種學習到的“信息”。以某個通道的值作為優(yōu)化目標,就可以明白這個通道究竟學習到了什么,這也就是 DeepDream 的基本原理。
我們通過預訓練的模型傳遞圖像,并使用我們希望獲得激活的神經(jīng)網(wǎng)絡層。神經(jīng)網(wǎng)絡會調整輸入像素值,直到令所選網(wǎng)絡層的激活值最大。同時,我們還需要確保激活的最大值不超過設定的閾值,因為我們不希望生成的圖像與原始圖像有巨大差異。
2. DeepDream 模型分析
對 DeepDream 有了簡單的了解后,接下來,我們制定實現(xiàn) DeepDream 算法的策略:
選擇需要最大化激活的神經(jīng)網(wǎng)絡層,并給這些網(wǎng)絡層分配更大的權重以增加它們在總損失中的比重
提取給定神經(jīng)網(wǎng)絡層得到的圖像特征,并計算每一層的損失值:
當該層中圖像輸出的平方和最高時,該圖像在該層的激活值最大
提取輸入像素值相對于損失的梯度變化
根據(jù)提取的梯度變化更新輸入圖像像素值
為更新的輸入圖像像素值計算所有選定網(wǎng)絡層上的損失值,即網(wǎng)絡層激活值的平方和
如果損失值大于預定義的閾值,則停止更新圖像
3. DeepDream 算法實現(xiàn)
在本節(jié)中,我們使用 keras 實現(xiàn) DeepDream 算法,生成更具藝術風格的圖像。
3.1 數(shù)據(jù)加載與預處理
導入相關的庫,并加載圖片:

同樣與對抗樣本生成一樣,如果使用?TensorFlow2
?作為?Keras
?的后端,需要在代碼開頭加上以下代碼,切換梯度求解的執(zhí)行模型:
定義圖像預處理函數(shù),以便隨后可以將其傳遞給?VGG19
?模型:
構建一個對處理后的圖像進行逆操作的函數(shù),以進行可視化:
使用以上預處理函數(shù)?preprocess_image
,預處理圖像,并加載預訓練的?VGG19
?模型:
3.2 DeepDream 生成模型
定義用于總損失值計算的神經(jīng)網(wǎng)絡層,使用第?2
?個和第?5
?個池化層用于總損失的計算,并為它們分配權重,使不同層將對總損失值具有不同貢獻,可以使用其他的網(wǎng)絡層和權重組合,生成不同圖片:
初始化損失函數(shù)以及模型中各個網(wǎng)絡層的字典:
計算激活的總損失值,遍歷選定用于計算激活的網(wǎng)絡層 (layer_contributions
),并記錄分配給每個網(wǎng)絡層的權重 (coeff
)。另外,我們計算選定神經(jīng)網(wǎng)絡層的輸出 (activation
),并在縮放后使用激活值的平方和來更新?lián)p失值:
初始化梯度值,使用?K.gradients
?方法可以用于計算損失相對于輸入?dream
?的梯度變化:
標準化梯度值,以使梯度的變化更加平緩:
創(chuàng)建函數(shù),將輸入圖像?dream
?映射到損失值和損失值相對于輸入像素值的梯度變化:
定義函數(shù)?eval_loss_and_grads
,使用?fetch_loss_and_grads
?函數(shù)計算輸入圖像的損失和梯度變化,并返回:
多次迭代計算的損失和梯度變化更新原始圖像,我們循環(huán)遍歷圖像?100
?次,首先定義更改學習率以及最大的損失上限,即圖像修改的上限:
接下來,計算圖像的損失和梯度變化值,如果損失值大于定義的閾值,則停止修改圖像:
基于梯度變化修改圖像,并對圖像進行逆向處理并進行可視化:
代碼生成的最終圖像如下所示:

從上圖可以看到,圖像中的包含波浪形的模式,這些模式是由于令各個網(wǎng)絡層的激活最大化的結果。
小結
DeepDream 利用訓練完成的深度卷積神經(jīng)網(wǎng)絡,僅需要優(yōu)化模型卷積層某個通道的激活值即可生成令人印象深刻的圖像。本節(jié)首先介紹了 DeepDream 的基本原理,并使用 Keras 實現(xiàn)了 DeepDream 生成模型,不僅能夠生成富有藝術感的圖像,同時加深對卷積神經(jīng)網(wǎng)絡的背后運行機制的理解。
這里給大家準備了一些我精心挑選的AI的學習資料。關注VX公眾H【咕泡AI】回復【333】即可領取!
①10G教學視頻包(附課件+代碼)
②AI人工智能:54份行業(yè)重磅報告匯總
③能寫進簡歷的企業(yè)級項目實戰(zhàn)。
④100篇+深度學習論文合集
⑤人工智能必讀書籍
⑥專屬學習路徑規(guī)劃
⑦不定期大神直播,學習和困惑解答
⑧拿來就能跑通的論文復現(xiàn)代碼講解及數(shù)據(jù)集
這些資料都比較珍貴,但是對自我的職業(yè)發(fā)展價值則是無價的!
別慌,這些資料這一次全部免費分享給大家。覺得好,就不要吝嗇你的三連哦,這樣我才有動力持續(xù)更新哦? ??