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
X = torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])
K = torch.tensor([[0.0,1.0],[2.0,3.0]])
Y=corr2d(X, K)
8.2 卷积核边缘计算
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
X = torch.ones((6,8))
X[:,2:6]=0
K=torch.tensor([[1.0,-1.0]])
Y=corr2d(X,K)#这样检测之后如果两个水平相邻的元素相同则输出为0,否则则是非0元素print(Y)
8.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
classConv2D(nn.Module):def__init__(self, kernel_size):super().__init__()self.weight=nn.Parameter(torch.rand(kernel_size))self.bias=nn.Parameter(torch.zeros(1))defforward(self,x):return corr2d(x,self.weight)+self.bias
X = torch.ones((6,8))
X[:,2:6]=0
K=torch.tensor([[1.0,-1.0]])
Y = corr2d(X, K)
conv2d=Conv2D(kernel_size=(1,2))
optimizer=torch.optim.SGD(conv2d.parameters(),lr=0.05)for epoch inrange(500):out=conv2d(X)loss=((out-Y)**2).mean()optimizer.zero_grad()loss.backward()optimizer.step()print(f"Epoch {epoch+1}, loss = {loss.item():.4f}")print(conv2d.weight.data)print(conv2d.bias.data)