日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

(pytorch-深度学习系列)CNN的多输入通道和多输出通道

發布時間:2024/8/23 pytorch 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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?]?]??????????????

corr2d_multi_in_out(X, K)

輸出:

tensor([[[ 56., 72.],[104., 120.]],[[ 76., 100.],[148., 172.]],[[ 96., 128.],[192., 224.]]])

總結

以上是生活随笔為你收集整理的(pytorch-深度学习系列)CNN的多输入通道和多输出通道的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。