(pytorch-深度学习系列)CNN的多输入通道和多输出通道
CNN的多輸入通道和多輸出通道
之前的輸入都視為二維數(shù)組,但是真實(shí)數(shù)據(jù)往往具有更高的維度,彩色圖像有RGB三個(gè)顏色通道,那么這個(gè)圖像(高為h,寬為w)可以表示為3?h?w3*h*w3?h?w的多維數(shù)組,一般將表示通道數(shù)的維(即3這一維)稱為通道維。
多輸入通道
對于多維的輸入,與二維的輸入卷積操作類似,只是這里我們的卷積核需要構(gòu)造成與輸入數(shù)據(jù)通道數(shù)相同,從而使其能夠與多通道數(shù)據(jù)進(jìn)行互相關(guān)運(yùn)算。
卷積的結(jié)果為將各個(gè)通道的互相關(guān)運(yùn)算結(jié)果相加
例如,對與雙通道數(shù)據(jù),其維度為(2 * 3 * 3):
input=[[012345678][123456789]]input = \begin{bmatrix} \begin{bmatrix} 0&1&2 \\ 3&4&5 \\ 6&7&8\end{bmatrix} \\ \\ \begin{bmatrix} 1&2&3 \\ 4&5&6 \\ 7&8&9\end{bmatrix} \end{bmatrix}input=??????????????036?147?258???????147?258?369????????????????
使用卷積核,其維度為(2 * 2 * 2):
kernel=[[0123][1234]]kernel = \begin{bmatrix} \begin{bmatrix} 0&1 \\ 2&3 \end{bmatrix} \\ \\ \begin{bmatrix} 1&2 \\ 3&4 \end{bmatrix} \end{bmatrix}kernel=???????[02?13?][13?24?]????????
那么運(yùn)算為:
input?kernel=[[012345678][123456789]]?[[0123][1234]]=[012345678]?[0123]+[123456789]?[1234]=[5672104120]input * kernel = \begin{bmatrix} \begin{bmatrix} 0&1&2 \\ 3&4&5 \\ 6&7&8\end{bmatrix} \\ \\ \begin{bmatrix} 1&2&3 \\ 4&5&6 \\ 7&8&9\end{bmatrix} \end{bmatrix} * \begin{bmatrix} \begin{bmatrix} 0&1 \\ 2&3 \end{bmatrix} \\ \\ \begin{bmatrix} 1&2 \\ 3&4 \end{bmatrix} \end{bmatrix} = \begin{bmatrix} 0&1&2 \\ 3&4&5 \\ 6&7&8\end{bmatrix} * \begin{bmatrix} 0&1 \\ 2&3 \end{bmatrix} + \begin{bmatrix} 1&2&3 \\ 4&5&6 \\ 7&8&9\end{bmatrix} * \begin{bmatrix} 1&2 \\ 3&4 \end{bmatrix} = \begin{bmatrix} 56&72 \\ 104&120 \end{bmatrix} input?kernel=??????????????036?147?258???????147?258?369????????????????????????[02?13?][13?24?]????????=???036?147?258?????[02?13?]+???147?258?369?????[13?24?]=[56104?72120?]
實(shí)現(xiàn)多通道的互相關(guān)運(yùn)算:
import torch from torch import nndef corr2d_multi_in(X, K):# 沿著X和K的第0維(通道維)分別計(jì)算再相加res = d2l.corr2d(X[0, :, :], K[0, :, :])for i in range(1, X.shape[0]):res += d2l.corr2d(X[i, :, :], K[i, :, :])return resdef corr2d(X, K): h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i, j] = (X[i: i + h, j: j + w] * K).sum()return Y輸入數(shù)據(jù)驗(yàn)證上面的矩陣計(jì)算:
X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]) K = torch.tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])corr2d_multi_in(X, K)輸出:
tensor([[ 56., 72.],[104., 120.]])多輸出通道
當(dāng)輸入通道有多個(gè)時(shí),因?yàn)槲覀儗Ω鱾€(gè)通道的結(jié)果做了累加,所以不論輸入通道數(shù)是多少,輸出通道數(shù)總是為1。
設(shè)卷積核輸入通道數(shù)和輸出通道數(shù)、高和寬分別為:
ci、co、kh、kwc_i 、c_o、 k_h、k_wci?、co?、kh?、kw?
如果希望得到含多個(gè)通道的輸出,我們可以為每個(gè)輸出通道分別創(chuàng)建一個(gè)核數(shù)組,其形狀為:
ci×kh×kwc_i\times k_h\times k_wci?×kh?×kw?
將它們在輸出通道維上連結(jié),卷積核的形狀即為
co×ci×kh×kwc_o\times c_i\times k_h\times k_wco?×ci?×kh?×kw?
在做互相關(guān)運(yùn)算時(shí),每個(gè)輸出通道上的結(jié)果由卷積核在該輸出通道上的核數(shù)組與整個(gè)輸入數(shù)組計(jì)算而來。
該運(yùn)算可以實(shí)現(xiàn)如下:
def corr2d_multi_in_out(X, K):# 對K的第0維遍歷,每次同輸入X做互相關(guān)計(jì)算。所有結(jié)果使用stack函數(shù)合并在一起return torch.stack([corr2d_multi_in(X, k) for k in K])測試該運(yùn)算:
K = torch.stack([K, K + 1, K + 2]) #(K+1)K中每個(gè)元素加一 K.shape # torch.Size([3, 2, 2, 2])則現(xiàn)在的核數(shù)組為:
kernel=[[[0123][1234]][[1234][2345]][[2345][3456]]]kernel = \begin{bmatrix} \begin{bmatrix} \begin{bmatrix} 0&1 \\ 2&3 \end{bmatrix} \begin{bmatrix} 1&2 \\ 3&4 \end{bmatrix} \end{bmatrix} \\\\ \begin{bmatrix} \begin{bmatrix} 1&2 \\ 3&4 \end{bmatrix} \begin{bmatrix} 2&3 \\ 4&5 \end{bmatrix} \end{bmatrix} \\\\ \begin{bmatrix} \begin{bmatrix} 2&3 \\ 4&5 \end{bmatrix} \begin{bmatrix} 3&4 \\ 5&6 \end{bmatrix} \end{bmatrix} \end{bmatrix}kernel=?????????????[[02?13?][13?24?]?][[13?24?][24?35?]?][[24?35?][35?46?]?]??????????????
輸出:
tensor([[[ 56., 72.],[104., 120.]],[[ 76., 100.],[148., 172.]],[[ 96., 128.],[192., 224.]]])總結(jié)
以上是生活随笔為你收集整理的(pytorch-深度学习系列)CNN的多输入通道和多输出通道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: New directions in au
- 下一篇: 拉普拉斯方程之美:万物的数学之匙