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 首次发布
该博客通过实例展示了如何使用PyTorch的内置函数实现二维卷积,并对比了手动矩阵运算实现卷积的结果,强调了理解卷积操作的重要性。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
PyTorch 2.5
PyTorch
Cuda
PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

被折叠的 条评论
为什么被折叠?



