矩阵运算和PyTorch.nn.Conv2d实现二位卷积代码

该博客通过实例展示了如何使用PyTorch的内置函数实现二维卷积,并对比了手动矩阵运算实现卷积的结果,强调了理解卷积操作的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值