最近在看風格轉換方面的**,發現很多**都離不開leno gatys的《a neural algorithm of artistic style》這篇*****,最初看的時候,對於*****中的數學公式匆匆掠過,並沒有進行深入理解,但是筆者認為如果能夠弄清楚一篇*****中的數學公式部分,那麼對於整篇*****的具體實現會有乙個更好的理解,以下是筆者對於*****中幾個數學公式的理解。
內容損失函式
在*****中內容損失函式及其偏導數的公式如下
看到這裡,筆者有兩個問題,一是為什麼求偏導的時候求和號消失了,二是為什麼當fl
ij小於0時偏導數為0。
先來解決第乙個問題。偏導數的定義是,在數學中,乙個多變數的函式的偏導數,就是它關於其中乙個變數的導數而保持其他變數恆定(相對於全導數,在其中所有變數都允許變化)。在此問題中,求的是關於fl
ij的偏導數,所以除fl
ij外的變數都可以視為常量,那麼常量關於變數fl
ij的導數便為0,所以只剩下ij處的導數,那麼求和號就消失了。關於ij處的導數,因為fl
與pl都是矩陣,所以可以先用fl
代替fl
ij進行求導,然後取矩陣中的ij元素。其中(f
l−pl
)ij 代表取矩陣(f
l−pl
) 中ij元素的值。
解決第二個問題之前,讓我們明確一下fl
ij的意義。fl
是vgg網路中第l層的特徵對映集,其中每一層有nl
個特徵對映,i代表nl
個特徵對映中的乙個。每乙個特徵對映的尺寸為特徵對映的高乘以特徵對映的寬,我們用ml
表示特徵對映高和寬的乘積,相當於把二維的特徵對映拉平為一維的,j就代表ml
中的乙個元素。所以現在fl
的尺寸為nl
*ml,fl
ij就代表在第l層中的第i個特徵對映中的第j個元素。 當f
lij<
0 就意味著特徵對映中的乙個元素小於0,在數字影象處理中,我們對於小於0的點,要進行置零處理。求偏導的目的是為了反向傳播進行梯度下降,而這一點小於0,在影象中也就沒有了意義,所以對於反向傳播沒有貢獻,直接置0。
格拉姆矩陣
在*****中,作者是這樣定義格拉姆矩陣的。
如果我們用矩陣的形式表示,應該是gl
=fl∗
flt ,其中fl
的尺寸為nl
*ml。這樣就可以得到nl
∗nl 的格拉姆矩陣。
在斯坦福cs20si的**當中,是gl
=fl fl
,但是在**中,fl
的尺寸是ml
nl,所以這兩者是不矛盾的。
風格損失函式
風格損失函式及其偏導數的表示如下:
看到這兩個公式,忍不住思考乙個問題,為什麼偏導數是公式(6)中所示的呢。
經過分析之後,可知公式(6)是經過求導的鏈式法則得來的,公式如下: ∂e
l∂fl
ij=∂
g∂fl
ij∗∂
el∂g
=∂g∂
flij
∗2(g
l−al
)14n
2lm2
l =∂
g∂fl
ij∗(
gl−a
l)12
n2lm
2l下面單獨求解一下∂g
∂fli
j ,這裡需要一些矩陣求導的知識,參考
g∂fl
=∂fl
∗flt
∂fl=
2flt
所以原式=∂
g∂fl
ij∗(
gl−a
l)12
n2lm
2l=2
flt∗
(gl−
al)1
2n2l
m2l=
(1n2
lm2l
flt(
gl−a
l))j
i
有心人可能已經注意到了下標由原來的(ij)變成了(ji),為什麼會這樣呢?因為矩陣fl
做過一次轉置,所以原來的(ij)元素對應現在的(ji)元素。
《程式設計實踐》筆記01 風格
程式設計實踐 筆記01 風格 noizz 發表於 2005 11 25 21 44 00 常見錯誤 1 注釋和 不一致 2 沒有講明乙個邏輯判斷中的具體業務意義 3 常量定義的名字沒有表示具體的邏輯含義 1 命名 常見錯誤 1 全域性變數名太短,沒有意義,沒有注釋。2 區域性變數太長,不簡潔。3 不...
c c 注釋風格轉換
c注釋風格 hhhfjjjsjd c 注釋風格 huajaijdh hushushdxkk 1.一般情況 int i 0 2.換行問題 int i 0 int j 0 int i 0 int j 0 3.匹配問題 int i 0 xx 4.多行注釋問題 int i 0 int j 0 int k 0...
C語言 注釋轉換(C風格 C 風格)
其中有一些檔案操作函式,不懂的可以看這篇部落格 首先,我們要知道乙個檔案中至少有五種狀態,我們用狀態圖表示 解讀 我們從 不是注釋 的狀態開始,請看下圖 有以下幾種情況需要注意 轉變成 轉變成 判斷是否為換行,如果換行需要輸入 轉變成 如果準備出注釋的時候,遇到 先保留看下乙個字元是不是 如果是 在...