import torch import torch.nn.functional as F # 输入(矩阵的行数和列数分别代表样本的高和宽) input = torch.tensor([[1,0,2,2,1], [2,1,0,2,1], [0,1,3,1,2], [3,2,1,2,3], [0,2,3,1,3]]) # 卷积核 kernel = torch.tensor([[2,1,1], [0,2,0], [1,2,0]]) print("输入矩阵:") print(input) print("卷积核矩阵:") print(kernel) print("输入大小:", input.shape) print("卷积核大小:", kernel.shape) # 重新定义尺寸,把尺寸改成四维张量。 print("---------重新定义尺寸--------------") # 第一维代表张量包含的样本或数据(batch size),第二维代表张量的通道(channel),第三维和第四维代表张量的大小 input = torch.reshape(input,(1,1,5,5)) # 第一维代表卷积核的个数,第二维代表每个卷积核的通道数,第三维和第四维代表卷积核的大小 kernel = torch.reshape(kernel,(1,1,3,3)) print(input.shape) print(kernel.shape) print("---------进行卷积操作--------------") output = F.conv2d(input,kernel)# 默认步长stride为1 print(output) # 卷积核是在输入矩阵上移动后遍历每一个像素,每次移动的大小就是步长stride # stride=1或2时的输出 print("---------不同步长的对比--------------") output1 = F.conv2d(input,kernel,stride=1) print(output1) output2 = F.conv2d(input,kernel,stride=2) print(output2) # 对输入矩阵周围采用0填充,每填充一次,矩阵大小的高和宽会在原来基础上+2*padding # padding=1或2时的输出 print("---------不同填充的对比--------------") output3 = F.conv2d(input,kernel,stride=1,padding=1)# 输入7*7,卷积核3*3 print(output3)# 输出5*5 output4 = F.conv2d(input,kernel,stride=1,padding=2)# 输入9*9,卷积核3*3 print(output4)# 输出7*7
代码运行结果:
输入矩阵: tensor([[1, 0, 2, 2, 1], [2, 1, 0, 2, 1], [0, 1, 3, 1, 2], [3, 2, 1, 2, 3], [0, 2, 3, 1, 3]]) 卷积核矩阵: tensor([[2, 1, 1], [0, 2, 0], [1, 2, 0]]) 输入大小: torch.Size([5, 5]) 卷积核大小: torch.Size([3, 3]) ---------重新定义尺寸-------------- torch.Size([1, 1, 5, 5]) torch.Size([1, 1, 3, 3]) ---------进行卷积操作-------------- tensor([[[[ 8, 11, 16], [14, 14, 10], [12, 16, 18]]]]) ---------不同步长的对比-------------- tensor([[[[ 8, 11, 16], [14, 14, 10], [12, 16, 18]]]]) tensor([[[[ 8, 16], [12, 18]]]]) ---------不同填充的对比-------------- tensor([[[[ 6, 4, 5, 8, 6], [ 5, 8, 11, 16, 12], [ 9, 14, 14, 10, 17], [ 7, 12, 16, 18, 17], [ 5, 13, 13, 9, 13]]]]) tensor([[[[ 0, 2, 1, 4, 6, 4, 1], [ 0, 6, 4, 5, 8, 6, 1], [ 1, 5, 8, 11, 16, 12, 4], [ 2, 9, 14, 14, 10, 17, 5], [ 0, 7, 12, 16, 18, 17, 7], [ 3, 5, 13, 13, 9, 13, 6], [ 0, 2, 5, 8, 10, 5, 6]]]])