专业做羽绒服的服装网站,海城市建设局网站,用asp做网站需要什么软件,网站代码需要注意什么问题CNN的多输入通道和多输出通道
之前的输入都视为二维数组#xff0c;但是真实数据往往具有更高的维度#xff0c;彩色图像有RGB三个颜色通道#xff0c;那么这个图像#xff08;高为h#xff0c;宽为w#xff09;可以表示为3∗h∗w3*h*w3∗h∗w的多维数组#xff0c;一般…CNN的多输入通道和多输出通道
之前的输入都视为二维数组但是真实数据往往具有更高的维度彩色图像有RGB三个颜色通道那么这个图像高为h宽为w可以表示为3∗h∗w3*h*w3∗h∗w的多维数组一般将表示通道数的维即3这一维称为通道维。
多输入通道
对于多维的输入与二维的输入卷积操作类似只是这里我们的卷积核需要构造成与输入数据通道数相同从而使其能够与多通道数据进行互相关运算。
卷积的结果为将各个通道的互相关运算结果相加
例如对与双通道数据其维度为2 * 3 * 3 input[[012345678][123456789]]input \begin{bmatrix} \begin{bmatrix} 012 \\ 345 \\ 678\end{bmatrix} \\ \\ \begin{bmatrix} 123 \\ 456 \\ 789\end{bmatrix} \end{bmatrix}input⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡⎣⎡036147258⎦⎤⎣⎡147258369⎦⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
使用卷积核其维度为2 * 2 * 2
kernel[[0123][1234]]kernel \begin{bmatrix} \begin{bmatrix} 01 \\ 23 \end{bmatrix} \\ \\ \begin{bmatrix} 12 \\ 34 \end{bmatrix} \end{bmatrix}kernel⎣⎢⎢⎢⎢⎡[0213][1324]⎦⎥⎥⎥⎥⎤
那么运算为 input∗kernel[[012345678][123456789]]∗[[0123][1234]][012345678]∗[0123][123456789]∗[1234][5672104120]input * kernel \begin{bmatrix} \begin{bmatrix} 012 \\ 345 \\ 678\end{bmatrix} \\ \\ \begin{bmatrix} 123 \\ 456 \\ 789\end{bmatrix} \end{bmatrix} * \begin{bmatrix} \begin{bmatrix} 01 \\ 23 \end{bmatrix} \\ \\ \begin{bmatrix} 12 \\ 34 \end{bmatrix} \end{bmatrix} \begin{bmatrix} 012 \\ 345 \\ 678\end{bmatrix} * \begin{bmatrix} 01 \\ 23 \end{bmatrix} \begin{bmatrix} 123 \\ 456 \\ 789\end{bmatrix} * \begin{bmatrix} 12 \\ 34 \end{bmatrix} \begin{bmatrix} 5672 \\ 104120 \end{bmatrix} input∗kernel⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡⎣⎡036147258⎦⎤⎣⎡147258369⎦⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤∗⎣⎢⎢⎢⎢⎡[0213][1324]⎦⎥⎥⎥⎥⎤⎣⎡036147258⎦⎤∗[0213]⎣⎡147258369⎦⎤∗[1324][5610472120]
实现多通道的互相关运算
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])
#(K1)K中每个元素加一
K.shape # torch.Size([3, 2, 2, 2])则现在的核数组为 kernel[[[0123][1234]][[1234][2345]][[2345][3456]]]kernel \begin{bmatrix} \begin{bmatrix} \begin{bmatrix} 01 \\ 23 \end{bmatrix} \begin{bmatrix} 12 \\ 34 \end{bmatrix} \end{bmatrix} \\\\ \begin{bmatrix} \begin{bmatrix} 12 \\ 34 \end{bmatrix} \begin{bmatrix} 23 \\ 45 \end{bmatrix} \end{bmatrix} \\\\ \begin{bmatrix} \begin{bmatrix} 23 \\ 45 \end{bmatrix} \begin{bmatrix} 34 \\ 56 \end{bmatrix} \end{bmatrix} \end{bmatrix}kernel⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡[[0213][1324]][[1324][2435]][[2435][3546]]⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
corr2d_multi_in_out(X, K)输出
tensor([[[ 56., 72.],[104., 120.]],[[ 76., 100.],[148., 172.]],[[ 96., 128.],[192., 224.]]])