反卷積是一種特殊的正向卷積操作, 通過補零的方式擴大輸入影象的尺寸, 接著翻轉卷積核, 和普通卷積一樣進行正向卷積, 由於前期補充了大量的零, 即便進行了卷積運算, 輸出影象的尺寸依然比輸入影象大, 這樣就達到了向上取樣的目的
下面展示一些例項, 使用 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裡面實驗求證,我還記得當時以...