#多个输入通道import torch
from torch import nn
import matplotlib.pyplot as plt
defcorr2d(X,k):#计算二维互相关运算h,w=k.shape#卷积核的长和宽Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-W+1)的全零矩阵for i inrange(Y.shape[0]):for j inrange(Y.shape[1]):Y[i,j]=(X[i:i+h,j:j+w]*k).sum()#不指定dim的话是全部都加载一起#print(X[i:i+h,j:j+w]*k)return Y
#首先需要把每一个输入通道与每一个卷积核计算corr然后把结果取sum()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]]])#2*3*3
K = torch.tensor([[[0.0,1.0],[2.0,3.0]],[[1.0,2.0],[3.0,4.0]]])
corr2d_multi_in(X,K)
9.3 多输出通道计算
#多输出通道import torch
from torch import nn
import matplotlib.pyplot as plt
defcorr2d(X,k):#计算二维互相关运算h,w=k.shape#卷积核的长和宽Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-W+1)的全零矩阵for i inrange(Y.shape[0]):for j inrange(Y.shape[1]):Y[i,j]=(X[i:i+h,j:j+w]*k).sum()#不指定dim的话是全部都加载一起#print(X[i:i+h,j:j+w]*k)return Y
defcorr2d_multi_in(X,K):returnsum(corr2d(x,k)for x,k inzip(X,K))#首先需要把每一个输入通道与每一个卷积核计算corr然后把结果取sum()defcorr2d_multi_in_out(X,K):return torch.stack([corr2d_multi_in(X,k)for k in K],0)#return sum(corr2d(x,k) for x,k in zip(X,K))'
K = torch.tensor([[[0.0,1.0],[2.0,3.0]],[[1.0,2.0],[3.0,4.0]]])
K = torch.stack((K,K+1,K+2),0)print(K.shape)
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]]])#2*3*3#将X的每一个通道与每一个卷积核做计算之后相加得到一个2x2的特征,然后由于有3个卷积,所以stack在一起就变成[3,2,2]的结果了
corr2d_multi_in_out(X,K)
9.4 多输出通道计算(1x1卷积)
#1x1的卷积核测试import torch
from torch import nn
import matplotlib.pyplot as plt
defcorr2d(X,k):#计算二维互相关运算h,w=k.shape#卷积核的长和宽Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-W+1)的全零矩阵for i inrange(Y.shape[0]):for j inrange(Y.shape[1]):Y[i,j]=(X[i:i+h,j:j+w]*k).sum()#不指定dim的话是全部都加载一起#print(X[i:i+h,j:j+w]*k)return Y
defcorr2d_multi_in(X,K):returnsum(corr2d(x,k)for x,k inzip(X,K))#首先需要把每一个输入通道与每一个卷积核计算corr然后把结果取sum()defcorr2d_multi_in_out(X,K):return torch.stack([corr2d_multi_in(X,k)for k in K],0)#return sum(corr2d(x,k) for x,k in zip(X,K))'defcorr2d_multi_in_out_1x1(X,K):c_i,h,w=X.shape#[2,2,2]c_o=K.shape[0]#[3,2,2,2]X=X.reshape((c_i,h*w))#flatten()K=K.reshape((c_o,c_i))Y=torch.matmul(K,X)print(Y.shape)return Y.reshape((c_o,h,w))
X = torch.normal(0,1,(3,3,3))
K = torch.normal(0,1,(2,3,1,1))#K.shape[0]是我自己设定的
Y1=corr2d_multi_in_out_1x1(X,K)
Y2=corr2d_multi_in_out(X,K)assertfloat(torch.abs(Y1-Y2).sum())<1e-6#检查Y1==Y2
torch.isclose(Y1,Y2,rtol=1e-6,atol=0.0)
9.5 池化操作
import torch
from torch import nn
import matplotlib.pyplot as pltdefpool2d(X,pool_size,mode='max'):ph,pw=pool_sizeY=torch.zeros((X.shape[0]-ph+1,X.shape[1]-pw+1))for i inrange(Y.shape[0]):for j inrange(Y.shape[1]):if mode=='max':Y[i,j]=X[i:i+ph,j:j+pw].max()elif mode=='avg':Y[i,j]=X[i:i+ph,j:j+pw].mean()return Y
X = torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])print(pool2d(X,(2,2),mode='max'))print(pool2d(X,(2,2),mode='avg'))