(pytorch-深度学习系列)CNN的多输入通道和多输出通道
CNN的多輸入通道和多輸出通道
之前的輸入都視為二維數組,但是真實數據往往具有更高的維度,彩色圖像有RGB三個顏色通道,那么這個圖像(高為h,寬為w)可以表示為3?h?w3*h*w3?h?w的多維數組,一般將表示通道數的維(即3這一維)稱為通道維。
多輸入通道
對于多維的輸入,與二維的輸入卷積操作類似,只是這里我們的卷積核需要構造成與輸入數據通道數相同,從而使其能夠與多通道數據進行互相關運算。
卷積的結果為將各個通道的互相關運算結果相加
例如,對與雙通道數據,其維度為(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?]????????
那么運算為:
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?]
實現多通道的互相關運算:
import torch from torch import nndef corr2d_multi_in(X, K):# 沿著X和K的第0維(通道維)分別計算再相加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輸入數據驗證上面的矩陣計算:
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.]])多輸出通道
當輸入通道有多個時,因為我們對各個通道的結果做了累加,所以不論輸入通道數是多少,輸出通道數總是為1。
設卷積核輸入通道數和輸出通道數、高和寬分別為:
ci、co、kh、kwc_i 、c_o、 k_h、k_wci?、co?、kh?、kw?
如果希望得到含多個通道的輸出,我們可以為每個輸出通道分別創建一個核數組,其形狀為:
ci×kh×kwc_i\times k_h\times k_wci?×kh?×kw?
將它們在輸出通道維上連結,卷積核的形狀即為
co×ci×kh×kwc_o\times c_i\times k_h\times k_wco?×ci?×kh?×kw?
在做互相關運算時,每個輸出通道上的結果由卷積核在該輸出通道上的核數組與整個輸入數組計算而來。
該運算可以實現如下:
def corr2d_multi_in_out(X, K):# 對K的第0維遍歷,每次同輸入X做互相關計算。所有結果使用stack函數合并在一起return torch.stack([corr2d_multi_in(X, k) for k in K])測試該運算:
K = torch.stack([K, K + 1, K + 2]) #(K+1)K中每個元素加一 K.shape # torch.Size([3, 2, 2, 2])則現在的核數組為:
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.]]])總結
以上是生活随笔為你收集整理的(pytorch-深度学习系列)CNN的多输入通道和多输出通道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: New directions in au
- 下一篇: (pytorch-深度学习系列)pyto