1. 程式人生 > >基於卷積神經網路實現圖片風格的遷移 1

基於卷積神經網路實現圖片風格的遷移 1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

卷積神經網路詳解

一、實驗介紹

1.1 實驗內容

Prisma 是最近很火的一款APP,它能夠將一張普通的影象轉換成各種藝術風格的影象。本課程基於卷積神經網路,使用Caffe框架,探討圖片風格遷移背後的演算法原理,手把手教你實現和Prisma一樣的功能,讓電腦學習梵高作畫。

本節課我們將學習CNN(卷積神經網路)的相關知識,學習本門課程之前,你需要先去學習814 使用python實現深度神經網路,也許你已經學過820 使用卷積神經網路進行圖片分類中的卷積神經網路,對CNN有了一定的瞭解,但我依然強烈建議你學習本節課,本節課所講解的卷積神經網路對於影象風格遷移演算法原理的理解至關重要。

1.2 實驗知識點

  • 為什麼要引入CNN
  • 卷積神經網路的層次結構

1.3 實驗環境

  • Xfce終端

1.4 先修課程

二、卷積神經網路

2.1 CNN的引入

在人工的全連線神經網路中,每相鄰兩層之間的每個神經元之間都是有邊相連的。當輸入層的特徵維度變得很高時,這時全連線網路需要訓練的引數就會增大很多,計算速度就會變得很慢,例如一張黑白的28×28 的手寫數字圖片,輸入層的神經元就有784(28×28)個,如下圖所示:

若在中間只使用一層隱藏層,引數 w 就有 784×15=11760 多個;若輸入的是 28×28 帶有顏色的RGB格式的手寫數字圖片,輸入神經元就有28×28×3=2352(RGB有3個顏色通道)個。這很容易看出使用全連線神經網路處理影象中的需要訓練引數過多的問題。

而在卷積神經網路(Convolutional Neural Network,CNN)中,卷積層的神經元只與前一層的部分神經元節點相連,即它的神經元間的連線是非全連線的,且同一層中某些神經元之間的連線的權重w 和偏移 b 是共享的(即相同的),這樣大量地減少了需要訓練引數的數量。

卷積神經網路CNN的結構一般包含這幾個層:

  • 輸入層:用於資料的輸入
  • 卷積層:使用卷積核進行特徵提取和特徵對映
  • 激勵層:由於卷積也是一種線性運算,因此需要增加非線性對映
  • 池化層:進行下采樣,對特徵圖稀疏處理,減少資料運算量。
  • 全連線層:通常在CNN的尾部進行重新擬合,減少特徵資訊的損失
  • 輸出層:用於輸出結果

當然中間還可以使用一些其他的功能層:

  • 歸一化層(Batch Normalization):在CNN中對特徵的歸一化
  • 切分層:對某些(圖片)資料的進行分割槽域的單獨學習
  • 融合層:對獨立進行特徵學習的分支進行融合

2.2 CNN的層次結構

2.2.1 輸入層 Input Layer

在CNN的輸入層中,圖片資料輸入的格式與全連線神經網路的輸入格式一維向量不太一樣。CNN的輸入層的輸入格式保留了圖片本身的結構

對於黑白的 28×28 的圖片,CNN的輸入是一個 28×28 的的二維神經元,如下圖所示:

而對於RGB格式的28×28圖片,CNN的輸入則是一個3×28×28的三維神經元(RGB中的每一個顏色通道都有一個28×28的矩陣),如下圖所示:

2.2.2 卷積層 Convolutional Layers

在卷積層中有幾個重要的概念:

  • 感知視野 (local receptive fields)
  • 共享權值 (shared weights)

假設輸入的是一個 28×28 的二維神經元,我們定義 5×5 的一個 local receptive fields(感知視野),即隱藏層的神經元與輸入層的5×5 個神經元相連,這個 5×5 的區域就稱之為 Local Receptive Fields,如下圖所示:

可類似看作:隱藏層中的神經元具有一個固定大小的感知視野去感受上一層的部分特徵。在全連線神經網路中,隱藏層中的神經元的感知視野足夠大乃至可以看到上一層的所有特徵。

而在卷積神經網路中,隱藏層中的神經元的感受視野比較小,只能看到上一次的部分特徵,上一層的其他特徵可以通過平移感知視野來得到同一層的其他神經元,由同一層其他神經元來看:

設移動的步長為 1:從左到右掃描,每次移動 1 格,掃描完之後,再向下移動一格,再次從左到右掃描。

具體過程如動圖所示:

可看出卷積層的神經元是隻與前一層的部分神經元節點相連,每一條相連的線對應一個權重 w

一個感知視野帶有一個 卷積核(或濾波器 filter),我們將感知視野中的權重 w 矩陣稱為卷積核;將感受視野對輸入的掃描間隔稱為步長(stride,步長在長和寬上的移動保持一致);當步長比較大時(stride>1),為了掃描到邊緣的一些特徵,感受視野可能會“出界”,這時需要對邊界擴充(pad),邊界擴充可以設為0 或其他值。步長和邊界擴充值的大小由使用者來定義。

卷積核 的大小由使用者來定義,即定義的感知視野的大小;卷積核的權重矩陣的值,便是卷積神經網路的引數,為了有一個偏移項,卷積核可附帶一個偏移項b,它們的初值可以隨機來生成,可通過訓練進行變化。 在神經網路中,我們經常加入偏移項來引入非線性因素,如果這裡你不理解什麼是非線性因素,後文中介紹激勵層時將具體敘述。

動圖演示的是 3*3 卷積核對影象卷積的過程,步長為 1,偏移項0。因此,當我們使用5*5 卷積核操作時,感知視野掃描後可以計算出下一層神經元的值為:

對下一層的所有神經元來說,它們從不同的位置去探測了上一層神經元的特徵。

我們將通過一個帶有卷積核的感知視野掃描生成的下一層神經元矩陣稱為一個 feature map (特徵對映圖),如下圖的右邊便是一個feature map

因此在同一個 feature map 上的神經元使用的卷積核是相同的,因此這些神經元共享權值 shared weights,共享卷積核中的權值和附帶的偏移。一個feature map 對應一個卷積核,若我們使用 3 個不同的卷積核,可以輸出3個 feature map:(感知視野:5×5,布長stride:1

因此在CNN的卷積層,我們需要訓練的引數大大地減少到了 (5×5+1)×3=78 (一個卷積核中包括5*5=25個未定引數,隨機偏移項1個引數)個。

假設輸入的是 28×28 的RGB圖片,即輸入的是一個 3×28×28 的的二維神經元,這時卷積核的大小不只用長和寬來表示,還有深度,感知視野也對應的有了深度,如下圖所示:

由圖可知,感知視野: 3×2×2 ; 卷積核: 3×2×2 ,深度為 3;下一層的神經元的值為:

此處輸入圖片的描述

卷積核的深度和感知視野的深度相同,都由輸入資料來決定,長寬可由自己來設定,數目也可以由自己來設定,一個卷積核依然對應一個 feature map

2.2.3 激勵層 Activiation Layers

關於神經網路激勵函式的作用,常聽到的解釋是:不使用激勵函式的話,神經網路的每層都只是做線性變換,多層輸入疊加後也還是線性變換。因為線性模型的表達能力不夠,激勵函式可以引入非線性因素。 其實很多時候我們更想直觀的瞭解激勵函式的是如何引入非線性因素的。

我們使用神經網路來分割平面空間作為例子:

此處輸入圖片的描述

圖的上半部分是沒有激勵函式的神經網路,其輸出實際是線性方程,然後用複雜的線性組合來逼近曲線,得到最終的 Positive Region A ;

加入非線性激勵函式後,神經網路就有可能學習到平滑的曲線來分割平面,而不是用複雜的線性組合逼近平滑曲線來分割平面,如圖的下半部分所示,這就是為什麼我們要有非線性的啟用函式的原因。

常見的啟用函式包括Sigmoid函式、Softmax函式、ReLu函式,深度神經網路使用的激勵函式一般為 ReLu(Rectified Linear Units)函式(計算量小,效果顯著):

卷積層和激勵層通常合併在一起稱為“卷積層”。

2.2.4 池化層 Pooling Layers

當輸入經過卷積層時,若感受視野比較小,布長 stride 比較小,得到的 feature map(特徵圖)還是比較大,可以通過池化層來對每一個feature map 進行降維操作,輸出的深度還是不變的,依然為 feature map 的個數。

池化層也有一個“池化視野( pooling filter )”來對 feature map 矩陣進行掃描,對“池化視野”中的矩陣值進行計算,一般有兩種計算方式:

  • Max pooling:取“池化視野”矩陣中的最大值
  • Average pooling:取“池化視野”矩陣中的平均值

掃描的過程中同樣地會涉及的掃描布長stride,掃描方式同卷積層一樣,先從左到右掃描,結束則向下移動布長大小,再從左到右。如下圖示例所示:

其中 池化卷積核2×2,布長stride:2

最後可將 324×24feature map 下采樣得到 324×24 的特徵矩陣:

2.2.5 全連線層 Fully Connected Layers,FC

其實卷積層也可以看作是全連線的一種簡化形式:不全連線+引數共享,但是卷積層還保留了空間位置資訊,大大減少了引數並且使得訓練變得可控。不同channel同一位置上的全連線等價與1x1的卷積核的卷積操作。N個節點的全連線可近似為N個模板卷積後的均值池化(GAP)

全連線本質是矩陣的乘法,相當於一個特徵空間變換,可以把有用的資訊提取整合。再加上啟用函式的非線性對映,多層全連線層理論上可以模擬任何非線性變換;但缺點也很明顯:無法保持空間結構,全連線的一個作用是維度變換,尤其是可以把高維變到低維,同時把有用的資訊保留下來。全連線另一個作用是隱含語義的表達(embedding),把原始特徵對映到各個隱語義節點(hidden node)。對於最後一層全連線而言,就是分類的顯示錶達。

一般卷積神經網路模型中只有最後1~2層是全連線層,對於這一層一個不嚴謹的理解就是,經過卷積、池化等處理,我們可以得到了一系列高度抽象過的 feature map,將特徵圖輸入全連線層,全連線的過程可以對這些特徵進行投票,1,2,3 特徵更像是貓的特徵,2,4,5 更像是狗的特徵,從而最終得到每個類別的概率。

但是需要注意的是,全連線層並不是必須的,由於全連線層輸入引數過多,以及會丟失一些特徵位置資訊的缺點,現在FCN(Fully Convolutional Networks 全卷積網路)逐漸火了起來,但這不是本文的重點,不再詳述。

三、實驗總結

本節課我們學習了卷積神經網路的知識,概括為:

  • 為什麼要引入CNN
  • 卷積神經網路的層次結構

下節課我們將學習經典卷積神經網路模型VGG,並用caffe提供的draw_net.py對網路模型進行視覺化操作,之後我們還將講解影象遷移演算法原理。

四、課後習題

[可選]請學習教程820 使用卷積神經網路進行圖片分類

五、參考文獻

  1. http://neuralnetworksanddeeplearning.com/chap6.html
  2. https://brohrer.github.io/how_convolutional_neural_networks_work.html
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述