天天看點

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

一、風格遷移簡介

風格遷移(style transfer)是深度學習衆多應用中非常有趣的一種,如圖,我們可以使用這種方法把一張圖檔的風格“遷移”到另一張圖檔上:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

這其中的原因在于,在原始的風格遷移過程中,把生成圖檔的過程當做一個“訓練”的過程。每生成一張圖檔,都相當于要訓練一次模型,這中間可能會疊代幾百幾千次。如果你了解過一點機器學習的知識,就會知道,從頭訓練一個模型要比執行一個已經訓練好的模型要費時太多。而這也正是原始的風格遷移速度緩慢的原因。

二、快速風格遷移簡介

快速風格遷移的網絡結構包含兩個部分。一個是“生成網絡”(原文中為transformation

network),一個是“損失網絡”(loss

network)。生成網絡接收一個圖檔當做輸入,然後輸出也是一張圖檔(即風格遷移後的結果)。如下圖,左側是生成網絡,右側為損失網絡:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

訓練階段:首先標明一張風格圖檔。訓練的目标是讓生成網絡可以有效生成圖檔。目标由損失網絡定義。

執行階段:給定一張圖檔,将其輸入生成網絡,輸出這張圖檔風格遷移後的結果。

我們可以發現,在模型的“執行”階段我們就可以完成風格圖檔的生成。是以生成一張圖檔的速度非常塊,在gpu上一般小于1秒,在cpu上運作也隻需要幾秒的時間。

三、快速風格遷移的tensorflow實作

還有變換效果如下。

原始圖檔:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

風格遷移後的圖檔:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?
深度學習實踐:如何使用Tensorflow實作快速風格遷移?
深度學習實踐:如何使用Tensorflow實作快速風格遷移?
深度學習實踐:如何使用Tensorflow實作快速風格遷移?

以上圖檔在gpu(titan black)下生成約需要0.8s,cpu(i7-6850k)下生成用時約2.9s。

關于快速風格遷移,其實之前在github上已經有了tensorflow的兩個實作:

<a href="https://github.com/junrushao1994/fast-neural-style.tf" target="_blank">junrushao1994/fast-neural-style.tf</a>

<a href="https://github.com/olavhn/fast-neural-style" target="_blank">olavhn/fast-neural-style</a>

但是第一個項目隻提供了幾個訓練好的模型,沒有提供訓練的代碼,也沒有提供具體的網絡結構。是以實際用處不大。

而第二個模型做了完整的實作,可以進行模型的訓練,但是訓練出來的效果不是很好,在作者自己的部落格中,給出了一個範例,可以看到生成的圖檔有很多噪聲點:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

四、一些實作細節

1、與tensorflow slim結合

slim是tensorflow的一個擴充庫,提供了很多與圖像分類有關的函數,已經很多已經訓練好的模型(如vgg、inception系列以及resnet系列)。

下圖是slim支援的模型:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

使用slim替換掉原先的網絡之後,在損失函數中,我們不僅可以使用vgg16,也可以友善地使用vgg19、resnet等其他網絡結構。具體的實作請參考源碼。

2、改進轉置卷積的兩個trick

原先我們需要使用網絡生成圖像的時候,一般都是采用轉置卷積直接對圖像進行上采樣。

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

對應的tensorflow的實作:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

以上為第一個trick。

3、注意使用optimizer和saver

這是關于tensorflow實作的一個小細節。

在tensorflow中,optimizer和saver是預設去訓練、儲存模型中的所有變量的。但在這個項目中,整個網絡分為生成網絡和損失網絡兩部分。我們的目标是訓練好生成網絡,是以隻需要去訓練、儲存生成網絡中的變量。在構造optimizer和saver的時候,要注意隻傳入生成網絡中的變量。

找出需要訓練的變量,傳遞給optimizer:

深度學習實踐:如何使用Tensorflow實作快速風格遷移?

五、總結

總之是做了一個還算挺有趣的項目。代碼不是特别多,如果隻是用訓練好的模型生成圖檔的話,使用cpu也可以在幾秒内運作出結果,不需要去搭建gpu環境。建議有興趣的同學可以自己玩一下。

關于訓練,其實也有一段比較坎(dan)坷(teng)的調參經曆,下次有時間再分享一下,今天就先寫到這兒。謝謝大家!

本文作者:何之源

繼續閱讀