优达学城《DeepLearning》2-5:风格迁移
這次我們將學(xué)習(xí)一種風(fēng)格轉(zhuǎn)換方法,該方法具體原來可見論文《Image Style Transfer Using Convolutional Neural Networks》,使用卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行圖像風(fēng)格轉(zhuǎn)換,作者是Gatys。
在本文中,我們使用19層的VGG網(wǎng)絡(luò)中的特征提取層,該網(wǎng)絡(luò)由一系列卷積層和池化層以及幾個(gè)全連接層組成。在下圖中,卷積層按堆棧及其在堆棧中的順序命名。Conv1是圖像在第一個(gè)堆棧中通過的第一個(gè)卷積層。Conv2_1是第二個(gè)堆棧中的第一個(gè)卷積層。網(wǎng)絡(luò)中最深的卷積層是conv5_4。
分離樣式和內(nèi)容
風(fēng)格傳遞依賴于圖像內(nèi)容和風(fēng)格的分離。給定一個(gè)內(nèi)容圖像和一個(gè)樣式圖像,我們的目標(biāo)是創(chuàng)建一個(gè)新的目標(biāo)圖像,該圖像應(yīng)包含我們所需的內(nèi)容和樣式組件:
- 圖像內(nèi)容:目標(biāo)對象及其排列
- 圖像風(fēng)格:樣式、顏色和紋理
下面是一個(gè)示例,圖像內(nèi)容是一只貓,圖像風(fēng)格是Hokusai's Great Wave。生成的目標(biāo)圖像仍然包含貓,但樣式變?yōu)椴ɡ恕⑺{(lán)色和米色,以及塊打印狀的紋理!
在本筆記本中,我們將使用預(yù)訓(xùn)練的VGG19從圖像中提取內(nèi)容或樣式特征。然后,我們將形式化內(nèi)容和樣式丟失的概念,并使用它們來迭代更新目標(biāo)圖像,直到得到我們想要的結(jié)果。我們鼓勵(lì)您使用自己的風(fēng)格和內(nèi)容圖片,并在Twitter上與@udacity分享您的作品;我們很想看看你的想法!
加載VGG19
VGG19分為兩部分:
- vgg19特征提取層:所有的卷積層和池化層
- vgg19分類器層:最后的三個(gè)線性分類器層
我們只需要特征提取部分,我們將在下面加載模型并“凍結(jié)”權(quán)重。
你可以加載任何你想要的圖片!下面,我們提供了一個(gè)helper函數(shù),用于加載任何類型和大小的圖像。load_image函數(shù)還將圖像轉(zhuǎn)換為標(biāo)準(zhǔn)化的張量。
接下來,我將按文件名加載圖像,并強(qiáng)制風(fēng)格圖像與內(nèi)容圖像的大小相同。
為了獲得圖像的內(nèi)容和樣式表示,我們必須通過VGG19網(wǎng)絡(luò)將圖像前向傳播,直到到達(dá)所需的層,然后從該層獲得輸出。
內(nèi)容和樣式特征
TODO:獲取特征提取層。
Gram矩陣
每個(gè)卷積層的輸出都是一個(gè)張量,其維度與batch_size、depth、d以及一定的高度和寬度(h, w)有關(guān)。卷積層的Gram矩陣可以計(jì)算如下:
- 通過batch_size, d, h, w = tensor.size()獲取depth, height, width。
- reshape張量,使其維度被拉平。
-
通過將重構(gòu)后的張量乘以它的轉(zhuǎn)置來計(jì)算gram矩陣
注意:兩個(gè)矩陣的乘法可以使用函數(shù):torch.mm(matrix1, matrix2)
TODO:完成gram_matrix函數(shù)
把他們放一起
現(xiàn)在我們已經(jīng)編寫了用于提取特征和計(jì)算給定卷積層的gram矩陣的函數(shù);讓我們把所有這些碎片放在一起!我們將從圖像中提取特征,并為樣式表示中的每一層計(jì)算gram矩陣。
損失和權(quán)重
下面給出了在每個(gè)相關(guān)層中權(quán)重樣式表示的選項(xiàng)。建議您使用0-1之間的范圍來衡量這些層。通過對更前面的層(conv1_1和conv2_1)進(jìn)行更多加權(quán),您可以期望在結(jié)果的目標(biāo)圖像中得到更大的樣式組件。如果您選擇對后面的層進(jìn)行加權(quán),那么您將會更加強(qiáng)調(diào)較小的樣式組件。這是因?yàn)槊恳粚佣加胁煌拇笮?#xff0c;它們一起創(chuàng)建了一個(gè)多尺度的樣式表示
就像在論文中一樣,我們定義了alpha(內(nèi)容權(quán)重)和beta(樣式權(quán)重)。這個(gè)比例將影響你的最終圖像的風(fēng)格化程度。建議您保留內(nèi)容權(quán)重= 1,并將樣式權(quán)重設(shè)置為您想要的比例。
更新Target和計(jì)算損失
你將決定一些步驟來更新你的圖像,這與你之前看到的訓(xùn)練循環(huán)類似,只是我們改變了我們的目標(biāo)圖像,沒有其他關(guān)于VGG19或任何其他圖像。因此,steps的數(shù)量真的由您來設(shè)置!我建議使用至少2000步來獲得好的結(jié)果。但是,如果您只是測試不同的權(quán)重值或試驗(yàn)不同的圖像,那么您可能希望從更少的步驟開始。
在迭代循環(huán)中,您將計(jì)算內(nèi)容和樣式損失,并相應(yīng)地更新目標(biāo)圖像。
內(nèi)容損失
內(nèi)容損失是目標(biāo)特征與內(nèi)容特征在conv4_2層的均方差。這可以如下計(jì)算:
ontent_loss = torch.mean((target_features['conv4_2'] - content_features['conv4_2'])**2)
樣式損失
樣式損失以類似的方式計(jì)算,只是您必須遍歷多個(gè)層,在我們的字典樣式權(quán)重中通過名稱指定。
- 您將計(jì)算每一層的目標(biāo)圖像、target_gram和樣式圖的target_gram的gram矩陣,并比較這些gram矩陣,計(jì)算圖層樣式損失。稍后,你會看到這個(gè)值被圖層的大小標(biāo)準(zhǔn)化了。
總損失
最后,您將通過將樣式和內(nèi)容損失相加,并將它們與指定的alpha和beta進(jìn)行加權(quán),從而創(chuàng)建總的損失。
我們會打印出這個(gè)損失;如果損失很大,不要驚慌。改變圖像的風(fēng)格需要一些時(shí)間,您應(yīng)該關(guān)注目標(biāo)圖像的外觀,而不是任loss值。但是,您應(yīng)該看到這種損失會隨著迭代次數(shù)的增加而減少。
TODO: Define content, style, and total losses.
結(jié)果:
Total loss at : 96257672.0
Total loss at : 15236884.0
Total loss at : 7416982.0
Total loss at : 4611283.5
Total loss at : 3088661.5
顯示目標(biāo)圖像
備注一下原始風(fēng)格圖像:
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的优达学城《DeepLearning》2-5:风格迁移的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI视频行为分析系统项目复盘——技术篇1
- 下一篇: AI视频行为分析系统项目复盘——技术篇2