深入了解 反卷積

2021-09-24 20:32:55 字數 2257 閱讀 1737

本來想寫個叫做 深入理解反卷積,後來一想這不就跟寫了「精通c++」一樣嘛,就寫個了解得了。等寫完了發現,似乎啥也沒寫,想寫的很多,但是無從下筆啊。。。

首先來看看mxnet和pytorch中的卷積和反卷積是怎麼用的:

torch.nn.conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=true)

torch.nn.convtranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, bias=true)

mxnet.gluon.nn.conv2d(channels, kernel_size, strides=(1, 1), padding=(0, 0), dilation=(1, 1), groups=1, layout='nchw', activation=none, use_bias=true, weight_initializer=none, bias_initializer='zeros', in_channels=0, **kwargs)

mxnet.gluon.nn.conv2dtranspose(channels, kernel_size, strides=(1, 1), padding=(0, 0), output_padding=(0, 0), dilation=(1, 1), groups=1, layout='nchw', activation=none, use_bias=true, weight_initializer=none, bias_initializer='zeros', in_channels=0, **kwargs)[source]

o = [ (i + 2p - k)/s ] +1 (1)

其中:o : 為 output size

i: 為 input size

p: 為 padding size

k: 為kernel size

s: 為 stride size

為下取整運算

這裡有動畫的演示:

但是究竟是不是這樣的呢,在pytorch源**中我們可以看到:

pytorch/aten/src/thnn/generic/spatialconvolutionmm.c(

第54行:

int64_t outputheight = div_rtn(exactinputheight - kh, dh) + 1;

int64_t outputwidth = div_rtn(exactinputwidth - kw, dw) + 1;

這裡的padding工作在之前一步已經完成了,的確和上述的公式是對應的。

其實裡面還有乙個不起眼的引數:group,這裡group的用法也比較奇怪:

inputs = torch.randn(1, 4, 5, 5)

weights = torch.randn(4, 2, 3, 3)

z = f.conv_transpose2d(inputs, weights, padding=0,groups =4)

print (z.shape)

這裡實際上是pytorch的後端實現,再往下就是torch._c了就解析到了c語言源**了,這裡實際上已經是在做輸入函式和該層引數的計算了,但是doc中寫的是,權重的輸出channel 的數值是 inputs/groups 這是啥意思呢?

其實groups的意思是將對應的輸入通道與輸出通道數進行分組, 預設值為1, 也就是說預設輸出輸入的所有通道各為一組。 比如輸入資料大小為90x100x100x32,通道數32,要經過乙個3x3x48的卷積,group預設是1,就是全連線的卷積層。

如果group是2,那麼對應要將輸入的32個通道分成2個16的通道,將輸出的48個通道分成2個24的通道。對輸出的2個24的通道,第乙個24通道與輸入的第乙個16通道進行全卷積,第二個24通道與輸入的第二個16通道進行全卷積。

極端情況下,輸入輸出通道數相同,比如為24,group大小也為24,那麼每個輸出卷積核,只與輸入的對應的通道進行卷積。

這個思想最早來自於alexnet,當時這麼搞實際上是因為當時的視訊記憶體有限,他弄了兩塊卡來計算,當時也沒有更好的並行神經網路框架,於是就這麼搞了,後來在另外的**中,有人指出,這方法並不是很好用,於是後來大家就沒有怎麼關注這個引數了,都是預設1來全卷積。近來發現mxnet框架用反卷積做上取樣,這樣的話,group就必須和輸入一致才可以了。

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解Dojo Data

譯自http www.sitepen.com blog 2010 10 13 dive into dojo data 使用dojo data有助於快速建立web應用的介面,且易於嵌入各種資料來源。它在使用者介面與底層資料之間提供了一層抽象層,使得使用者介面開發人員能夠專注於ui的開發,而無需擔心資料...