轉(zhuǎn)置卷積
轉(zhuǎn)置卷積(Transposed Convolution),也稱為反卷積(Deconvolution),是卷積神經(jīng)網(wǎng)絡(luò)(CNN)中的一種操作,它可以將一個(gè)低維度的特征圖(如卷積層的輸出)轉(zhuǎn)換為更高維度的特征圖(如上一層的輸入)。轉(zhuǎn)置卷積操作通常用于圖像分割、生成對(duì)抗網(wǎng)絡(luò)(GAN)和語音識(shí)別等任務(wù)中。
在傳統(tǒng)卷積操作中,我們使用一個(gè)滑動(dòng)窗口(卷積核)來從輸入圖像中提取特征。而在轉(zhuǎn)置卷積中,我們使用一個(gè)滑動(dòng)窗口來填充零值的輸出圖像,然后通過卷積核來計(jì)算輸出圖像中每個(gè)像素的值。這個(gè)過程可以看作是對(duì)輸入特征圖進(jìn)行上采樣(增加分辨率)的過程。
具體來說,假設(shè)我們有一個(gè)輸入特征圖 X X X,大小為 N × N × C N\times N\times C N×N×C,其中 N N N 是特征圖的寬和高, C C C 是特征圖的通道數(shù)。我們還有一個(gè)大小為 K × K K\times K K×K 的卷積核 W W W,其中 K K K 是卷積核的大小。轉(zhuǎn)置卷積的輸出特征圖 Y Y Y 的大小為 ( N + 2 P ? K + 1 ) × ( N + 2 P ? K + 1 ) × C ′ (N+2P-K+1)\times(N+2P-K+1)\times C' (N+2P?K+1)×(N+2P?K+1)×C′,其中 P P P 是填充大小, C ′ C' C′ 是輸出特征圖的通道數(shù)。轉(zhuǎn)置卷積的計(jì)算方式可以表示為:
Y i , j , k = ∑ u = 0 K ? 1 ∑ v = 0 K ? 1 ∑ c ′ = 1 C ′ X i + u , j + v , c W u , v , c ′ , k Y_{i,j,k} = \sum_{u=0}^{K-1}\sum_{v=0}^{K-1}\sum_{c'=1}^{C'} X_{i+u,j+v,c}W_{u,v,c',k} Yi,j,k?=u=0∑K?1?v=0∑K?1?c′=1∑C′?Xi+u,j+v,c?Wu,v,c′,k?
其中 i , j i,j i,j 是輸出特征圖中的坐標(biāo), k k k 是輸出特征圖中的通道數(shù), u , v u,v u,v 是卷積核中的坐標(biāo), c c c 是輸入特征圖中的通道數(shù), c ′ c' c′ 是輸出特征圖中的通道數(shù)。
需要注意的是,轉(zhuǎn)置卷積的輸出特征圖大小取決于填充大小 P P P,因此要根據(jù)具體的應(yīng)用場(chǎng)景和網(wǎng)絡(luò)結(jié)構(gòu)來確定填充大小。另外,轉(zhuǎn)置卷積還可以通過調(diào)整步長(stride)來控制輸出特征圖的大小。如果步長為 S S S,則輸出特征圖的大小為 ( N ? 1 ) × S + K ? 2 P (N-1)\times S+K-2P (N?1)×S+K?2P。
基本操作
讓我們暫時(shí)忽略通道,從基本的轉(zhuǎn)置卷積開始,設(shè)步幅為1且沒有填充。 假設(shè)我們有一個(gè) n h × n w n_h\times n_w nh?×nw?的輸入張量和一個(gè) k h × k w k_h\times k_w kh?×kw?的卷積核。 以步幅為1滑動(dòng)卷積核窗口,每行 n h n_h nh?次,每列 n w n_w nw?次,共產(chǎn)生 n h × n w n_h\times n_w nh?×nw?個(gè)中間結(jié)果。 每個(gè)中間結(jié)果都是一個(gè) ( n h × k h ? 1 ) × ( n w × k w ? 1 ) (n_h\times k_h-1)\times (n_w\times k_w-1) (nh?×kh??1)×(nw?×kw??1)的張量,初始化為0。 為了計(jì)算每個(gè)中間張量,輸入張量中的每個(gè)元素都要乘以卷積核,從而使所得的 k h × k w k_h\times k_w kh?×kw?張量替換中間張量的一部分。 請(qǐng)注意,每個(gè)中間張量被替換部分的位置與輸入張量中元素的位置相對(duì)應(yīng)。 最后,所有中間結(jié)果相加以獲得最終結(jié)果。
舉個(gè)例子如下:
我們可以對(duì)輸入矩陣X和卷積核矩陣K實(shí)現(xiàn)基本的轉(zhuǎn)置卷積運(yùn)算trans_conv。
def trans_conv(X, K):
h, w = K.shape
Y = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))
for i in range(X.shape[0]):
for j in range(X.shape[1]):
Y[i: i + h, j: j + w] += X[i, j] * K
return Y
X = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
trans_conv(X, K)
或者使用torch自帶的API:
X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 2, 2)
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)
tconv.weight.data = K
tconv(X)
nn.ConvTranspose2d 是 PyTorch 中用于創(chuàng)建轉(zhuǎn)置卷積層的函數(shù),它有以下參數(shù):
in_channels:輸入特征圖的通道數(shù)。
out_channels:輸出特征圖的通道數(shù)。
kernel_size:卷積核的大小。可以是一個(gè)整數(shù)(表示正方形卷積核的邊長),也可以是一個(gè)長度為 2 的元組或列表(表示長方形卷積核的寬和高)。
stride:卷積核的步長??梢允且粋€(gè)整數(shù)(表示在寬度和高度上的步長相同),也可以是一個(gè)長度為 2 的元組或列表(表示在寬度和高度上的步長分別為多少)。
padding:填充大小??梢允且粋€(gè)整數(shù)(表示在寬度和高度上的填充大小相同),也可以是一個(gè)長度為 2 的元組或列表(表示在寬度和高度上的填充大小分別為多少)。
output_padding:輸出特征圖的填充大小??梢允且粋€(gè)整數(shù)(表示在寬度和高度上的填充大小相同),也可以是一個(gè)長度為 2 的元組或列表(表示在寬度和高度上的填充大小分別為多少)。默認(rèn)為 0。
groups:輸入和輸出通道之間的分組數(shù)。通常將其設(shè)置為 1,表示不進(jìn)行通道分組。如果設(shè)置為大于 1 的值,則表示在輸入和輸出通道之間進(jìn)行分組卷積。
bias:是否使用偏置。默認(rèn)為 True,表示使用偏置。如果設(shè)置為 False,則不使用偏置。
dilation:卷積核的膨脹率。可以是一個(gè)整數(shù)(表示在寬度和高度上的膨脹率相同),也可以是一個(gè)長度為 2 的元組或列表(表示在寬度和高度上的膨脹率分別為多少)。默認(rèn)為 1,表示不進(jìn)行膨脹卷積。
填充、步幅和多通道
與常規(guī)卷積不同,在轉(zhuǎn)置卷積中,填充被應(yīng)用于的輸出(常規(guī)卷積將填充應(yīng)用于輸入)。 例如,當(dāng)將高和寬兩側(cè)的填充數(shù)指定為1時(shí),轉(zhuǎn)置卷積的輸出中將刪除第一和最后的行與列。
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, padding=1, bias=False)
tconv.weight.data = K
tconv(X)
在轉(zhuǎn)置卷積中,步幅被指定為中間結(jié)果(輸出),而不是輸入。 使用上圖中相同輸入和卷積核張量,將步幅從1更改為2會(huì)增加中間張量的高和權(quán)重,因此輸出張量在如下圖:
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, stride=2, bias=False)
tconv.weight.data = K
tconv(X)
對(duì)于多個(gè)輸入和輸出通道,轉(zhuǎn)置卷積與常規(guī)卷積以相同方式運(yùn)作。 假設(shè)輸入有
c
i
c_i
ci?個(gè)通道,且轉(zhuǎn)置卷積為每個(gè)輸入通道分配了一個(gè)
k
h
×
k
w
k_h\times k_w
kh?×kw?的卷積核張量。 當(dāng)指定多個(gè)輸出通道時(shí),每個(gè)輸出通道將有一個(gè)
c
i
×
k
h
×
k
w
c_i\times k_h\times k_w
ci?×kh?×kw?的卷積核。
性質(zhì)
如果我們將 X X X代入卷積層 f f f來輸出 Y = f ( X ) Y=f(X) Y=f(X),并創(chuàng)建一個(gè)與 f f f具有相同的超參數(shù)、但輸出通道數(shù)量是 X X X中通道數(shù)的轉(zhuǎn)置卷積層 g g g,那么 g ( Y ) g(Y) g(Y)的形狀將與 X X X相同。 下面的示例可以解釋這一點(diǎn)。
X = torch.rand(size=(1, 10, 16, 16))
conv = nn.Conv2d(10, 20, kernel_size=5, padding=2, stride=3)
tconv = nn.ConvTranspose2d(20, 10, kernel_size=5, padding=2, stride=3)
tconv(conv(X)).shape == X.shape
這個(gè)性質(zhì)揭示了為什么這個(gè)操作被稱為反卷積,因?yàn)樗途矸e操作互逆文章來源:http://www.zghlxwxcb.cn/news/detail-479847.html
注意
1.數(shù)值不同,不可逆,形狀可逆
2.效率高。原因:
①普通卷積操作的前向傳播通過矩陣乘法一次實(shí)現(xiàn),而非形式上的卷積核進(jìn)行卷積并平移
②普通卷積操作的反向傳播是輸入乘轉(zhuǎn)置權(quán)重矩陣
③上述代碼表明,轉(zhuǎn)置卷積作用實(shí)質(zhì)上也是矩陣乘法,其前向傳播為普通卷積的反向傳播,反向傳播同理文章來源地址http://www.zghlxwxcb.cn/news/detail-479847.html
到了這里,關(guān)于計(jì)算機(jī)視覺:轉(zhuǎn)置卷積的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!