import torch
import torch.nn as nn
import torch.nn.functional as F
in_channels=1
out_channels=1
kernel_size=3
bias=False
batch_size=1
input_size=[batch_size,in_channels,4,4]
conv_layer=torch.nn.Conv2d(in_channels,out_channels,kernel_size,bias=bias)
input=torch.randn(input_size)
# print(input)
out=conv_layer(input)
# print(conv_layer.weight)
# print(out)
input=torch.randn(5,5)
kernel=torch.randn(3,3)
bias=torch.randn(1)
#原始矩阵实现二维卷积,先不考虑barct_size和channel
def martix_multi_for_conv2d(input,kernel,bias=0,stride=1,padding=1):
if padding>0:
input=F.pad(input,(padding,padding,padding,padding))
input_h,input_w=input.shape
kernel.h,kernel.w=kernel.shape
output_h=(input_h+1-kernel.h)
output_w=(input_w+1-kernel.w)
output=torch.zeros(output_w,output_w)
for i in range(0,input_h-kernel.h+1,stride):
for j in range(0,input_w-kernel.w+1,stride):
region=input[i:i+kernel.h,j:j+kernel.w]#取出被核滑动的区域
output[int(i/stride),int(j/stride)]=torch.sum(region*kernel)+bias#点乘,并赋值给输出位置的元素
return output
padding=1
#矩阵运算实现卷积的结果
print(martix_multi_for_conv2d(input,kernel,bias=bias,padding=1))
#调用pytorch卷积的结果
conv2d_output=F.conv2d(input.reshape((1,1,input.shape[0],input.shape[1])),kernel.reshape((1,1,kernel.shape[0],kernel.shape[1])),
padding=1,bias=bias)
print(conv2d_output.squeeze(0).squeeze(0))
矩阵运算和PyTorch.nn.Conv2d实现二位卷积代码
于 2022-03-18 22:38:21 首次发布