PyTorch 反卷積運算 一

2021-10-13 23:03:28 字數 3211 閱讀 1182

反卷積是一種特殊的正向卷積操作, 通過補零的方式擴大輸入影象的尺寸, 接著翻轉卷積核, 和普通卷積一樣進行正向卷積, 由於前期補充了大量的零, 即便進行了卷積運算, 輸出影象的尺寸依然比輸入影象大, 這樣就達到了向上取樣的目的

下面展示一些例項, 使用 pytorch 計算反卷積

示例-1: 輸入輸出通道數都是1, 步長也為1

輸入資料 1*1*3*3(batch 和 channel 均為 1)

in [1]

:import torch

in [2]

:from torch import nn

in [3]

: torch.manual_seed(0)

out[3]

:>

in [4]

: x = torch.randint(

5, size=(1

,1,3

,3), dtype=torch.

float

)in [5]

: xout[5]

: tensor([[

[[4.

,4.,

3.],

[0.,

3.,4

.],[

2.,3

.,2.

]]]]

)

卷積核 1*1*2*2

in [6]

: w = torch.tensor([[

1,2]

,[0,

1]], dtype=torch.

float

).view(1,

1,2,

2)in [7]

: wout[7]

: tensor([[

[[1.

,2.]

,[0.

,1.]

]]])

建立反卷積層, 不使用偏置(方便計算)

in [8]

: layer = nn.convtranspose2d(in_channels=

1, out_channels=

1, kernel_size=

2, stride=

1, padding=

0, bias=

false

)in [9]

: layer.weight = nn.parameter(w)

in [10]

: layer.

eval()

out[10]

: convtranspose2d(1,

1, kernel_size=(2

,2), stride=(1

,1), bias=

false

)

手動計算

翻轉卷積核

對於正常卷積oup = (inp + 2*padding - kernel_size) / stride + 1, 反卷積可以看做普通卷積的映象操作, 反卷積的輸入對應正向卷積的輸出, 令oup=3, 得inp=4(padding=0, kernel_size=2, stride=1), 所以輸出尺寸為 4*4

步長為 1 時, 僅在四周補零, 為了得到 4*4 的輸出, 需要補一圈零

# 無需正向傳播

in [17]

:with torch.no_grad():

...: y = layer(x)..

.: in [18]

: yout[18]

: tensor([[

[[4.

,12.,

11.,6

.],[

0.,7

.,14.

,11.]

,[2.

,7.,

11.,8

.],[

0.,2

.,3.

,2.]

]]])

修改反卷積層, 額外設定 padding=1

# padding=1

in [30]

: layer_2 = nn.convtranspose2d(in_channels=

1, out_channels=

1, kernel_size=

2, stride=

1, padding=

1, bias=

false

)in [31]

: layer_2.weight = nn.parameter(w)

in [32]

: layer_2.

eval()

out[32]

: convtranspose2d(1,

1, kernel_size=(2

,2), stride=(1

,1), padding=(1

,1), bias=

false

)

根據oup = (inp + 2*padding - kernel_size) / stride + 1, 代入 oup=3, padding=1, kernel_size=2, stride=1, 得 inp=2, 反卷積後特徵圖尺寸為 2*2, 此時無需填充零, 計算過程為

pytorch 反卷積 視覺化 手推反卷積

在推導反卷積之前,先推導一下卷積。假設輸入為 將輸入矩陣轉成乙個 則 所以 用pytorch驗證一下結果 import torch import torch.nn.functional as f x torch.tensor 0,1,2,3 4,5,6,7 8,9,10,11 12,13,14,15...

卷積和反卷積

n image h 2 pad h kernel h stride h 1 image w 2 pad w kernel w stride w 1 image h 輸入影象的高度 image w 輸入影象的寬度 pad h 在輸入影象的高度方向兩邊各增加pad h個單位長度 因為有兩邊,所以乘以2 ...

反卷積 轉置卷積

搞明白了卷積網路中所謂deconv到底是個什麼東西後,不寫下來怕又忘記,根據參考資料,加上我自己的理解,記錄在這篇部落格裡。第一次看到deconv這個詞,以為deconv的結果就是卷積的逆,覺得神奇,不禁產生了 哦?轉置的卷積就可以求逆了嗎?這樣的想法,然後在matlab裡面實驗求證,我還記得當時以...