來自 google brain 的 augustus odena 等人的文章「deconvolution and checkerboard artifacts「的部分內容 1。影象生成網路的上取樣部分通常用反卷積網路,不合理的卷積核大小和步長會使反卷積操作產生棋盤效應 (checkerboard artifacts)。
為避免棋盤效應,有兩種方法可替換常規的反卷積(卷積的轉置)。與反卷積不同,上取樣方法本身不應有棋盤效應。理想的方法將會更遠離棋盤效應。
直觀地看,假設生成的影象中包含1只黑貓。黑貓身體部分的畫素顏色應平滑過渡,或極端地說,該部分應全為黑色。實際生成的影象中該部分卻有深深淺淺的近黑方塊組成,很像棋盤的網格,即棋盤效應。第一種方法是用到的反卷積核的大小可被步長整除,從而避免重疊效應。與最近成功用於影象超解析度的技術「子畫素卷積」(sub-pixel convolution)等價。
另一種方法是從卷積操作中分離出對卷積後更高解析度的特徵圖上取樣來計算特徵。例如,可以先縮放影象(最近鄰插值或雙線性插值),再卷積。貌似是個自然的方法。
反卷積與不同縮放卷積方法都是線性操作,並可用矩陣去解釋。對於每個輸出視窗,反卷積操作的輸入唯一,縮放卷積會以阻礙高頻棋盤效應的方式來隱式地集中權重(weight-tying)。
後面為猜測部分。從反卷積矩陣⎡⎣
⎢⎢⎢a
cbac
b⎤⎦⎥
⎥⎥來看,卷積應該為[a
c0b]
,則卷積的轉置為[a
0cb]
;步長為2,可整除反卷積大小。
縮放卷積為線性操作:假設原影象為
a ,經過插值後的影象為a+
b;用卷積核
c 對插值縮放後的影象卷積,得到最終的影象ct
∗(a+
b)=c
t∗a+
ct∗b
,其中∗
為卷積操作。則可將縮放卷積分解為原影象卷積和插值增量影象卷積,或卷積的原影象和卷積的插值增量影象。
c為卷積操作的卷積核。此時為上取樣,理解為反卷積操作中的卷積核。(1) 最近鄰縮放卷積⎡⎣
⎢⎢⎢a
+bac
b+ca
+bac
b+c⎤
⎦⎥⎥⎥
=⎡⎣⎢
⎢⎢ac
bacb
⎤⎦⎥⎥
⎥+⎡⎣
⎢⎢⎢b
acba
c⎤⎦⎥
⎥⎥發現,插值增量影象表示的矩陣為原影象表示的矩陣下移1行。可將原影象矩陣看成環形佇列(佇列最後1行的輸出送入佇列的第1行)。
(2) 雙線性縮放卷積⎡⎣
⎢⎢⎢⎢
⎢⎢⎢⎢
⎢⎢a+
b2a2
(?)c
+b2b
+c2+
a2a+
b2a2
c2c+
b2b+
c2+a
2c2⎤
⎦⎥⎥⎥
⎥⎥⎥⎥
⎥⎥⎥=
⎡⎣⎢⎢
⎢acb
acb⎤
⎦⎥⎥⎥
+⎡⎣⎢
⎢⎢⎢⎢
⎢⎢⎢⎢
⎢b2a
2(?)
c2b2
a2c2
⎤⎦⎥⎥
⎥⎥⎥⎥
⎥⎥⎥⎥
+⎡⎣⎢
⎢⎢⎢⎢
⎢⎢⎢⎢
⎢b2a
2c2b
2a2c
2⎤⎦⎥
⎥⎥⎥⎥
⎥⎥⎥⎥
⎥ 發現,插值增量影象可細分為原影象表示的矩陣下移1行後乘以12
與原影象表示的矩陣上移1行後乘以12
。(?)部分的元素為原文中的矩陣的缺失部分。所以,可能仍未理解 augustus odena 的本意。有誤導之嫌,僅供娛樂~σ(⊙▽⊙」a
反卷積的棋盤格效應
反卷積只能恢復出原訊號的shape,而並不能恢復value,若想要恢復出value還需要learn的過程 從3 3 6 6 對於stride 2,先將小解析度的feature map每乙個畫素中間插入stride 1個0值.然後進行正常的卷積操作 預設的卷積stride為1 得到卷積後的結果,再裁剪...
反卷積棋盤效應解決方法
反卷積 置卷積 後生成的影象,放大後往往會出現棋盤效應,在深色部分尤為明顯,如下圖所示 總結了幾種常用的解決方案,如下所示 1.修改反卷積形式 1 使用能被stride整除的kernel size,如kernel size 4,stride 2 2 堆疊反卷積減輕重疊 效果一般 3 網路末尾使用1x...
tensorflow實現卷積與反卷積自編碼框架
從dcgan中了解到了反卷積的操作,所以我本來打算能通過卷積操作作為編碼器將一幀影象轉換為乙個20維的向量,而後再通過反卷積實現解碼功能從而達到影象恢復效果,先把程式貼上,後續有空再調整網路層數和引數吧 from tensorflow.examples.tutorials.mnist import ...