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

2021-01-15 雷鋒網

雷鋒網註:本文作者何之源,復旦大學計算機科學碩士在讀,研究人工智慧計算機視覺方向。本文由雷鋒網編輯整理自作者知乎專欄,獲授權發布。

一、風格遷移簡介

風格遷移(Style Transfer)是深度學習眾多應用中非常有趣的一種,如圖,我們可以使用這種方法把一張圖片的風格「遷移」到另一張圖片上:

然而,(點擊查看論文)的速度是非常慢的。在GPU上,生成一張圖片都需要10分鐘左右,而如果只使用CPU而不使用GPU運行程序,甚至需要幾個小時。這個時間還會隨著圖片尺寸的增大而迅速增大。原始的風格遷移

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

二、快速風格遷移簡介

那有沒有一種方法,可以不把生成圖片當做一個「訓練」的過程,而當成一個「執行」的過程呢?答案是肯定的。可看快速風格遷移(fast neural style transfer):Perceptual Losses for Real-Time Style Transfer and Super-Resolution

快速風格遷移的網絡結構包含兩個部分。一個是「生成網絡」(原文中為Transformation Network),一個是「損失網絡」(Loss Network)。生成網絡接收一個圖片當做輸入,然後輸出也是一張圖片(即風格遷移後的結果)。如下圖,左側是生成網絡,右側為損失網絡:

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

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

我們可以發現,在模型的「執行」階段我們就可以完成風格圖片的生成。因此生成一張圖片的速度非常塊,在GPU上一般小於1秒,在CPU上運行也只需要幾秒的時間。

三、快速風格遷移的Tensorflow實現

話不多說,直接上我的代碼的(點擊可看)Github地址

還有變換效果如下。

原始圖片:

風格遷移後的圖片:

以上圖片在GPU(Titan Black)下生成約需要0.8s,CPU(i7-6850K)下生成用時約2.9s。

關於快速風格遷移,其實之前在Github上已經有了Tensorflow的兩個實現:

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

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

我的項目就是在的基礎上做了很多修改和調整。OlavHN/fast-neural-style

四、一些實現細節

1、與Tensorflow Slim結合

在原來的實現中,作者使用了VGG19模型當做損失網絡。而在原始的論文中,使用的是VGG16。為了保持一致性,我使用了對損失網絡重新進行了包裝。Tensorflow Slim

Slim是Tensorflow的一個擴展庫,提供了很多與圖像分類有關的函數,已經很多已經訓練好的模型(如VGG、Inception系列以及ResNet系列)。

下圖是Slim支持的模型:

使用Slim替換掉原先的網絡之後,在損失函數中,我們不僅可以使用VGG16,也可以方便地使用VGG19、ResNet等其他網絡結構。具體的實現請參考源碼。

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

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

指出了轉置卷積的一些問題,認為轉置卷積由於不合理的重合,使得生成的圖片總是有「棋盤狀的噪聲點」,它提出使用先將圖片放大,再做卷積的方式來代替轉置卷積做上採樣,可以提高生成圖片的質量,下圖為兩種方法的對比:這篇文章

對應的Tensorflow的實現:

以上為第一個Trick。

第二個Trick是文章 中提到的,用 Instance Normalization來代替通常的Batch Normalization,可以改善風格遷移的質量。Instance Normalization: The Missing Ingredient for Fast Stylization

3、注意使用Optimizer和Saver

這是關於Tensorflow實現的一個小細節。

在Tensorflow中,Optimizer和Saver是默認去訓練、保存模型中的所有變量的。但在這個項目中,整個網絡分為生成網絡和損失網絡兩部分。我們的目標是訓練好生成網絡,因此只需要去訓練、保存生成網絡中的變量。在構造Optimizer和Saver的時候,要注意只傳入生成網絡中的變量。

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

五、總結

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

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

相關焦點

  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    本文詳細介紹了部署和實現過程。對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。邊緣計算(Edge computing)是一種在物理上靠近數據生成的位置從而對數據進行處理和分析的方法,為解決這些問題提供了方案。
  • TFX 最新博文:如何使用 TensorFlow 生態系統實現快速高效的 BERT...
    當企業用這些模型在大型語料庫中進預訓練時,數據科學家可以將遷移學習應用到這些多用途的 transformer 模型中,並針對其領域特定的問題取得突破性的結果。在 SAP 的 Concur 實驗室,研究人員希望使用 BERT 解決差旅費領域的新問題。他們想簡化 BERT 的推論。但不幸的是,他們一直沒找到完美的解決方案。
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    用來實現高性能深度學習推理的平臺——TensorRT 與 TensorFlow Serving 打通結合,使用戶可以輕鬆地實現最佳性能的 GPU 推理。TensorFlow Serving 是應用於機器學習模型的靈活的高性能服務系統,而 NVIDIA TensorRT 則是一個用以實現高性能深度學習推理的平臺,將二者相結合後,用戶可以輕鬆地實現最佳性能的 GPU 推理。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    選自builtin作者:Vihar Kurama機器之心編譯參與:吳攀、杜偉谷歌的 Tensorflow 與 Facebook 的 PyTorch 一直是頗受社區歡迎的兩種深度學習框架。那麼究竟哪種框架最適宜自己手邊的深度學習項目呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網絡」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。
  • TensorFlow 資源大全中文版
    生成手寫體 – 實現Alex Grave的論文中關於生成手寫體的部分TensorFlow實現神經圖靈機 – TensorFlow實現神經圖靈機基於物體搜索和過濾視頻 – 使用卷積神經網絡基於視頻中的物品、地點等來搜索、過濾和描述視頻使用TensorFlow來轉換莎士比亞作品和現代版本的英語 – 實現莎士比亞作品和現代版本的英語的單語轉換聊天機器人 – 一個
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    作者:魯偉 一個數據科學踐行者的學習日記。
  • 玩轉TensorFlow?你需要知道這30功能
    如果你關心如何使模型保持最新並監控它們,那麼你可以了解一下這個產品、看看它的論文。地址是:tensorflow.org/tfx/?hl=zh-cn2)TensorFlow hub如果你想在小型數據集上訓練你的模型,或者提高泛化能力,你會需要使用遷移學習。
  • 【強化學習實戰】基於gym和tensorflow的強化學習算法實現
    1新智元推薦【新智元導讀】知乎專欄強化學習大講堂作者郭憲博士開講《強化學習從入門到進階》,我們為您節選了其中的第二節《基於gym和tensorflow的強化學習算法實現》,希望對您有所幫助。同時,由郭憲博士等擔任授課教師的深度強化學習國慶集訓營也將於 10 月 2 日— 6 日在北京舉辦。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    雷鋒網按:本文作者姚健,畢業於中科院計算所網絡數據實驗室,曾就職於360天眼實驗室,主要從事深度學習和增強學習相關研究工作。目前就職於騰訊MIG事業部,從事神經機器翻譯工作。摘要2015年11月9日,Google發布深度學習框架TensorFlow並宣布開源,並迅速得到廣泛關注,在圖形分類、音頻處理、推薦系統和自然語言處理等場景下都被大面積推廣。TensorFlow系統更新快速,官方文檔教程齊全,上手快速且簡單易用,支持Python和C++接口。
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    《TensorFlow學習筆記1:入門》連結:http://www.jeyzhang.com/tensorflow-learning-notes.html本文與上一篇的行文思路基本一致,首先概括了TensorFlow的特性,然後介紹了graph、session、variable 等基本概念的含義,以具體代碼的形式針對每個概念給出了進一步的解釋
  • TensorFlow極速入門
    作者孟曉龍,2016年加入Qunar,目前在去哪兒網機票事業部擔任算法工程師。熱衷於深度學習技術的探索,對新事物有著強烈的好奇心。一、前言目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。
  • 最熱門的深度學習框架TensorFlow入門必備書籍
    但進入機器學習和人工智慧領域並不是一件簡單的事情,目前市場上有許多大量的學習資源,許多開發者和想要進入的愛好者往往很難找到適合自己的發展路徑。其實,早在 2015 年底,谷歌就開源了內部使用的深度學習框架 TensorFlow 。眾多研究表明,Tensorflow 是研究深度學習的首選平臺。
  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    儘管可以使用傳統的插值方法(如雙線性插值和雙三次插值)來完成這個任務,但是產生的圖片質量卻經常差強人意。深度學習,尤其是對抗生成網絡 GAN,已經被成功應用在超分任務上,比如 SRGAN 和 ESRGAN 都可以生成比較真實的超分圖片。那麼在本文裡,我們將介紹一下如何使用TensorFlow Hub上的一個預訓練的 ESRGAN 模型來在一個安卓 app 中生成超分圖片。
  • 深度解讀TensorFlow,了解它的最新發展!
    Tensorboard是tensorflow內置的一個可視化工具,它通過將tensorflow程序輸出的日誌文件的信息可視化,使得tensorflow程序的理解、調試和優化更加簡單高效。Tensorboard的可視化依賴於tensorflow程序運行輸出的日誌文件,因而tensorboard和tensorflow程序在不同的進程中運行。
  • 深度學習的敲門磚:手把手教你TensorFlow初級入門
    公眾號: weic2c在開始使用機器學習算法之前,我們應該首先熟悉如何使用它們。  關於TensorFlow的Python和C ++ API的各種函數的詳細文檔,請參見https://www.tensorflow.org/api_docs/index.html 機器學習主要依賴於很多數學公式,本文將對使用TensorFlow進行這類數學運算做一個初步的介紹。
  • 程式設計師1小時完成深度學習Resnet,谷歌tensorflow多次圖像大賽冠軍
    閱前須知:為了使本文結構精簡,理解簡單,所以會儘量少涉及到有關數學公式,降低學習門檻,帶領讀者快速搭建ResNet-34經典模型並投入訓練。plain而言精度更高在以往的學習之中,我們知道深度網絡隨著層數的增加,很容易造成「退化」和「梯度消失」的問題,訓練數據的過擬合。
  • 在Windows中安裝Tensorflow和Kears深度學習框架
    建立Tensorflow的Anaconda虛擬環境在一臺計算機中,我們常常需要安裝很多軟體,但是每個軟體所需要的Python的關聯模塊或版本不相同。例如,我們要使用Python開發開發網站系統,安裝的網站框架可能需要Python2.X的版本,但是安裝Tensorflow需要Python3.5的版本,此時就會發生版本不一致的問題。
  • 最簡單的深度學習TensorFlow應用舉例!
    小編我的電腦很一般,沒有32G內存,也沒有1080,就windows上直接裝了23333windows+python 3.6+pycharm+tensorflow cpu話不多說,直接線性回歸,上圖。代碼截圖#接下來貼代碼#辰星樹洞import numpy as np #這是Python的一種開源的數值計算擴展,非常強大import tensorflow
  • 作為TensorFlow的底層語言,你會用C++構建深度神經網絡嗎?
    隨著 C++ API 的完善,直接使用 C++來搭建神經網絡已經成為可能,本文將向你介紹一種簡單的實現方法。很多人都知道 TensorFlow 的核心是構建在 C++之上的,但是這種深度學習框架的大多數功能只在 Python API 上才方便使用。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    在所有這些行業中,圖像分類都以一種或另一種方式使用。他們是如何做到的呢?他們使用哪個框架?你必須已閱讀很多有關不同深度學習框架(包括TensorFlow,PyTorch,Keras等)之間差異的信息。TensorFlow和PyTorch無疑是業內最受歡迎的框架。我相信你會發現無窮的資源來學習這些深度學習框架之間的異同。