標籤:input 開始 https ati view 亂序 size 操作 隨機梯度
作為一個脫離了低級趣味的碼農,春節假期閑來無事,決定做一些有意思的事情打發時間,碰巧看到這篇論文: A neural style of convolutional neural networks,譯作卷積神經網路風格遷移。 這不是“暮光女”克裡斯丁的研究方向嗎?!連好萊塢女星都開始搞人工智慧發paper,真是熱的可見一斑!
這篇文章中講述了如何用深層卷積神經網路來將一張普通的照片轉化成一幅藝術風格的畫作(比如梵谷的星夜),可以看做是DL(deep learning)在NPR(非真實渲染non photography rendering)領域的一次革命(不難想象以後DL這種跨領域的革命會越來越多)。
論文地址:A Neural Algorithm of Artistic Style
項目地址:https://github.com/muyiguangda/neural-style
演算法解析
(對演算法不感興趣的童鞋,可以直接跳過這一部分,看最終實驗結果)
【總流程】
如上,a有個別名是conv1_1
,b是conv2_1
,依次類推,c,d,e對應conv3_1
,conv4_1
,conv5_1
;輸入圖片有風格圖片style image
和內容圖片content image
,輸出的是就是合成圖片,然後用合成圖片為指導訓練,但是訓練的對象不像是普通的神經網路那樣訓練權值w
和偏置項b
,而是訓練合成圖片上的像素點,以達到損失函數不斷減少的效果。論文使用的是隨機的雜訊像素圖為初始合成圖,但是使用原始圖片會快一點。
首先他定義了兩個loss,分別表示最終產生的圖x和style圖a的樣式上的loss,以及x和content圖p的內容上的loss,α,β是調節兩者比例的參數。最終的loss function是兩者的加和。通過optimize總的loss求得最終的x。
所用的CNN網路是VGG-19,利用了它16個卷積層和5個pooling層來產生feature。實際指的是Conv+ReLU的複合體。
當然,使用其他pre-trained的model也是完全可以的,比如GoogLet V2,ResNet,VGG16 都是可以的(作者這哪是以VGG19為例)。
【內容損失函數】
- l代表第l層的特徵表示,
p
是原始圖片,x
是產生圖片。
- 假設某一層得到的響應是Fl∈RNl∗Ml,其中Nl為l層filter的個數,Ml為filter的大小。Flij表示的是第l層第i個filter在位置j的輸出。
- 公式的含義就是對於每一層,原始圖片產生特徵圖和產生圖片的特徵圖的一一對應做平方差
求內容損失函數梯度下降如下:
【風格損失函數】
F
是產生圖片的特徵圖。上面式子的含義:Gram第i行,第j列的數值等於把產生圖在第l
層的第i
個特徵圖與第j
個特徵圖分別拉成一維後相乘求和。
- 上面是風格損失函數,
Nl
是指產生圖的特徵圖數量,Ml
是圖片寬乘高。a
是指風格圖片,x
是指產生圖片。G
是產生圖的Gram矩陣,A
是風格圖的Gram矩陣,wl
是權重。
【總損失】
實驗結果
下面是內容圖,風格圖,以及迭代10次,100次,500次,1000次,10000次,10萬次的計算結果及分析:
【原圖】
原圖片如果尺寸過大,導致input層的batch size過大,會大大增加程式計算量(從而延長計算時間),容易引起程式不穩定,而對最終效果並沒有明顯提升,因此建議把圖片尺寸盡量縮小(在像素不失真的前提下),推薦值:800 ppi x 600 ppi.
【風格圖】
風格圖不需要和內容圖尺寸一致。可以適當裁剪,保留風格最突出的部分。
【迭代10次】
由於原始的輸入是一張白色雜訊圖片,因此,在迭代次數較少時,仍然沒有形成內容圖的輪廓。
【迭代100次】
天安門的輪廓初現
【迭代500次】
已經基本接近最終效果,既能看到天安門的形狀,又有梵谷“星夜”的線條風格和顏色搭配。
【迭代1000次】
500次到1000次,畫面構成的變化已經不劇烈,基本趨於平穩。
【迭代500次,重複執行三次】
重複計算了三次,使用相同的圖片,相同的卷積神經網路模型,相同的迭代次數(500次),卻得到了區別明顯的三張結果圖。這是非常有意思的地方!
(a) (b) (c)
最近看完一本書,叫《隨機漫步的傻瓜》,主要討論隨機性這個概念,隨機性中隱藏著不可預測的風險,也蘊含著無限的可能性。沒有隨機變異,生物進化可能還處在單細胞階段。
如果電腦只是一個工具,讓它解一個方程組,如果已知數確定,計算條件確定,無論計算多少次,結果都是同一個。
這個例子中,結果出現了差異,說明這個系統中一定有隨機的成分存在。
機器學習中隨機性出現的部分通常如下:1. 訓練樣本的亂序操作;2. 隨機梯度下降;3. 模型隨機賦初始值。
本例中還多一條:初始輸入的白色雜訊映像是隨機產生的。
【迭代10000次】
可以看到畫面右上部分,內容漸漸丟失,呈現灰色化。
推測原因:由於卷積神經網路中的若干pooling層,實際是對映像進行了均值處理,導致了邊緣細節的丟失。
pooling層:
那麼,迭代100000次是什麼樣子的呢?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
【迭代十萬次】
畫面朝著兩極化趨勢發展,灰色地區更加暗淡,彩色地區更加明亮,兩者之間的界限更加分明,失去了過渡。
【原創】梵谷油畫用深度卷積神經網路迭代十萬次是什麼效果? A neural style of convolutional neural networks