Deconvolution & Convolutional Sparse Coding

1. 概念

??Deconvolutional Networks, Zeiler, CVPR 2010

??首先我們要厘清這兩個(gè)概念, 就是Deconvolution和Convolutional Sparse Coding
??很多人在談這兩個(gè)問(wèn)題的時(shí)候使用的都是Deconvolution, 有一點(diǎn)混淆
??我覺(jué)得混淆的原因在于它出現(xiàn)的時(shí)候就把這兩個(gè)概念沒(méi)有分開(kāi)

??Deconvolution和Convolutional Sparse Coding都出自我們上面貼的這篇paper, 名字叫Deconvolutional Networks, 其實(shí)講的卻是Convolutional Sparse Coding, 其實(shí)Deconvolution只是實(shí)現(xiàn)卷積稀疏編碼的一個(gè)手段

知乎上關(guān)于deconvolution的解釋

??https://www.zhihu.com/question/43609045?sort=created

Decovolution


??https://blog.csdn.net/qiusuoxiaozi/article/details/77269740
??這篇里面提到的兩篇文章對(duì)Deconvolution這個(gè)問(wèn)題講的比較清楚
??Deconvolution很多人翻成"反卷積"或者"逆卷積"我覺(jué)得容易引起誤會(huì), 其實(shí)它叫轉(zhuǎn)置卷積(Transposed Convolution)更合適, 說(shuō)白了就是從用卷積結(jié)果乘以展平的卷積核轉(zhuǎn)置得到卷積前結(jié)果的過(guò)程

??舉個(gè)栗子, 4x4輸入, Kernal大小3x3, p=0, s=1, 輸出是2x2
??更多動(dòng)圖可以看https://github.com/vdumoulin/conv_arithmetic

no_padding_no_strides.gif

??輸入的矩陣可以展開(kāi)為16維向量, 記作x
??輸出的矩陣可以展開(kāi)為4維向量, 記作y
??卷積運(yùn)算就可以用矩陣乘積來(lái)表示y = Cx
??C就是如下的稀疏矩陣

C

??怎么算出來(lái)的呢, 我們來(lái)推導(dǎo)一下

stride=1 transposed推導(dǎo)

??所以x′ = C^T y′, 這個(gè)就是Deconvolution
轉(zhuǎn)置卷積的過(guò)程可以看下面這個(gè)圖


No padding, no strides, transposed

??上面是stride=0的情況, 如果stride≠1, 情況看起來(lái)會(huì)稍微復(fù)雜一點(diǎn)
??5x5輸入, Kernal大小3x3, p=0, s=2, 輸出是2x2, 那Transposed Convolution的推導(dǎo)就是這樣

??轉(zhuǎn)置卷積的過(guò)程變成了下面這個(gè)圖

stride=2 transpoesd推導(dǎo)

??當(dāng)stride≠1的時(shí)候, 轉(zhuǎn)置卷積的卷積核就變成了一個(gè)帶"洞"的卷積, 這時(shí)候給它起了個(gè)名字叫fractional stride convolution(微步卷積), 為什么帶洞? 其實(shí)我理解就是為了使卷積的步長(zhǎng)變?yōu)檎蚓矸e的1/s倍, 核將以一個(gè)更小的步伐移動(dòng), 比如正向的stride=2, 那轉(zhuǎn)置的stride=0.5, 這就是說(shuō)圖像上動(dòng)了一個(gè)pixel, 卷積核只能動(dòng)0.5個(gè)pixel, 就是要過(guò)去兩個(gè)pixel卷積核才能動(dòng)一步

??轉(zhuǎn)置卷積其實(shí)就是一種特殊的卷積形式, 轉(zhuǎn)置卷積可以用作解碼(從深度信息解回圖像大小)

images.png

??上面這個(gè)圖像就是Deconvolution一個(gè)非常重要的應(yīng)用, GAN生成圖像
??但是只能還原shape大小, 不能還原原value值
??按照CS231n中的說(shuō)法, 我們可以把它看作Learnable Upsampling, 有一點(diǎn)要注意, Deconvolution并不一定比Bicubic這些cheap upsampling方法的效果要好
??https://distill.pub/2016/deconv-checkerboard/
??容易產(chǎn)生Checkerboard Artifacts
??Deconvolution有一個(gè)重要應(yīng)用就是可視化Feature, https://blog.csdn.net/tina_ttl/article/details/52048765

Convolutional Sparse Coding


??剛才說(shuō)了, Deconvolution和Convolutional Sparse Coding之所以會(huì)混淆, 是因?yàn)閆eiler是在同一篇paper里提出的兩個(gè)概念
??那Convolutional Sparse Coding又是什么呢, 就是用卷積做Sparse Coding
??Sparse Coding就是用一組過(guò)完備基來(lái)表示向量, 得到的向量具有一定的稀疏性, 在Deconvolutional Networks中, 就是用Deconvolution的權(quán)重來(lái)作為這組過(guò)完備基, 為保證稀疏性, 優(yōu)化的目標(biāo)函數(shù)和一般的網(wǎng)絡(luò)就不一樣


單層Convolutional Sparse Coding

??通常, 我們訓(xùn)練網(wǎng)絡(luò)最終就是要結(jié)果盡量接近樣本值, 但是Convolutional Sparse Coding呢, 不止要結(jié)果盡量接近樣本值, 還要結(jié)果盡量稀疏, 就是高亮的那部分
??所以, 訓(xùn)練的時(shí)候也要比訓(xùn)練一般的神經(jīng)網(wǎng)絡(luò)復(fù)雜, 要交替優(yōu)化差異項(xiàng)和正則項(xiàng)
??一般是先固定filter學(xué)習(xí)feature map, 然后再固定feature map學(xué)習(xí)filter, iterally, 這個(gè)可以參考Sc訓(xùn)練字典的方法
??Convolutional Sparse Coding比之前的Sc的好處就是Inference的時(shí)候會(huì)更快, 因?yàn)橹癝c在訓(xùn)練階段把輸入數(shù)據(jù)集的超完備基學(xué)到了, 在測(cè)試階段還是要通過(guò)凸優(yōu)化的方法去求其特征值

??所以說(shuō)白了, Convolutional Sparse Coding就是用CNN的結(jié)構(gòu)來(lái)訓(xùn)練稀疏表達(dá)的字典, 與一般的CNN的差異就是目標(biāo)函數(shù)不止要差異盡量小, 還要feature具有稀疏性, 而Deconvolution根據(jù)我們上面的分析, 本質(zhì)上就是一種特殊的卷積, 只不過(guò)它能放大圖像的大小, 從空間壓縮的feature還原到原圖大小, 所以常被用在encoder-decoder結(jié)構(gòu)中, 還有一個(gè)重大的用途就是Visualization of Networks
??就是我們常引用的那篇
??Zeller et al., “Visualizing and understanding convolutional networks”. ECCV 2014

2. Pytorch中的ConvTranspose2d

??https://ptorch.com/docs/8/torch-nn

ConvTranpose2d

??Pytorch或者Keras中的ConvTranspose2d就是我們之前說(shuō)的Deconvolution, 和Conv2d不同的是, 多了一個(gè)output_padding參數(shù), 那這個(gè)參數(shù)是什么意思呢?http://www.itdecent.cn/p/01577e86e506
??首先要確立這個(gè)概念, 就是Transpose conv就是conv的轉(zhuǎn)置, 就是說(shuō)Transpose conv和conv還是一個(gè)過(guò)程

??所以stride,padding, dilation還是Conv2D的含義
??這個(gè)公式用來(lái)計(jì)算輸入輸出的形狀關(guān)系

Conv2D算ouput維度
  • o: output size
  • i: input size
  • p: padding size
  • k: kernel size
  • s: stride size

??建立在Conv2D和TranposeConv2D只是同一過(guò)程從兩個(gè)方向去理解, 那當(dāng)我們?nèi)ビ?jì)算TransposeConv2D的輸出維度的時(shí)候, 實(shí)際上就是在知道輸出維度的情況下, 反推輸入維度

s=1


??當(dāng)s=1時(shí), o與i是一一對(duì)應(yīng)的關(guān)系, 那此時(shí)在一定的padding, kernel情況下, 我們要根據(jù)input大小算output大小, 就是用上面那個(gè)公式從o反推i

Conv2D從output反推input維度

??栗子1, k=3, p=2, o=7, i=?

full_padding_no_strides_transposed.gif

??栗子2, k=3, p=1, o=5, i=?

same_padding_no_strides_transposed.gif

??舉這兩個(gè)栗子為了說(shuō)明什么呢?就是在TransposeConv2D里, padding和在Conv中是一樣的, 都是加在待卷積圖上的, 不同的是, 在Conv2D中, 待卷積圖是input, 在TransposeConv2D中, 待卷積圖是output

s≠1


??s≠1的時(shí)候, 那個(gè)向下取整就不能忽略掉了, 這個(gè)時(shí)候就出現(xiàn)一個(gè)問(wèn)題, 就是input和output不是一一對(duì)應(yīng)關(guān)系, 一個(gè)output可能對(duì)應(yīng)著好多個(gè)input
??比如k=2, s=2, p=0, i=4 => o=2
??而k=2, s=2, p=0, i=5 => o=2
??這兩種情況下, output的大小都是2, 那問(wèn)題來(lái)了, 在TransposeConv2D中, 如果input size=2, output size究竟是4還是5呢?

??已知o的情況下, 我們可以得到s個(gè)i的解

TransposeConv2D input->output 一對(duì)多

??為了解決上面我們說(shuō)的在TransposeConv2D中的尷尬的input和output 1對(duì)多問(wèn)題, 就有了這個(gè)output_padding

??output_padding就是給i(0)后面加的那個(gè)東西

增加output_padding后計(jì)算TransposeConv2D輸出維度

??也就是說(shuō), 如果output_padding=0, 那就認(rèn)為向下取整實(shí)際上沒(méi)有用, 比如k=2, s=2, p=0, i=4 => o=2為這種情況, +n就是在待卷積圖上再加上n行n列, 比如k=2, s=2, p=0, i=5 => o=2這種情況就是給i=4加上n=1的行列

??不管是padding還是output_padding, 我們都可以理解成是給待卷積圖上額外加的, 這樣比較容易理解, 但是padding=1是在整個(gè)外圈加一圈(相當(dāng)于加兩行兩列), output_padding=1就是給待卷積圖加上1行1列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容