# 实现多输入通道互相关运算import torch
from torch import nn
from d2l import torch as d2l
# 这里的输入是我们的输入x和卷积核Kdefcorr2d(X, K):"""算二维互相关运算"""
h, w = K.shape # 这里就是拿出卷积核的行和列
Y = torch.zeros(X.shape[0]-h +1, X.shape[1]- w +1)# 根据上面理论我们可以得到我们输出的矩阵的大小,也就是输入矩阵的行减去卷积核的行+1,列同理# 下面的两个for循环的作用是给,输出矩阵的每个元素赋值,这里就是拿卷积核和对应的区的元素做乘法运算for i inrange(Y.shape[0]):for j inrange(Y.shape[1]):
Y[i, j]=(X[i:i + h, j:j + w]* K).sum()return Y
# 处理多个输入通道defcorr2d_multi_in(X, K):returnsum(corr2d(x, k)for x, k inzip(X, K))# 验证互相关运算的输出
X = torch.tensor([[[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]],[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]])
K = torch.tensor([[[0.0,1.0],[2.0,3.0]],[[1.0,2.0],[3.0,4.0]]])
corr2d_multi_in(X, K)
tensor([[ 56., 72.],
[104., 120.]])
# 计算多个通道的输出的互相关函数defcorr2d_multi_in_out(X, K):# 这里stack的作用是在0这个维度上将我们得到的输出一个一个堆起来return torch.stack([corr2d_multi_in(X, k)for k in K],0)# 这里的输入X是一个3D的张量,这里是对每一个输出通道的K拿出一个k,这里k是一个3D的Tensor# 这里就是相当于增加一个维度,然后每一个K或者K+1或者K+2都是该维度的一个元素
K = torch.stack((K, K +1, K +2),0)
K.shape