F.conv2d实现代码

import math
import torch
import torch.nn.functional as F

def conv(x, kernel, bais, stride, padding):
    '''
    x: n,cin,h,w
    kernel: cout, cin, kh, kw
    '''
    n,c,h,w = x.size()   		#获得x原始尺度信息
    x = F.pad(x, (padding,)*4) #获得kernel参数,计算输出特征图大小和x上划区域的大小
    cout, cin, kh, kw = kernel.size()
    oh = math.floor((h - kh + 2*padding)/stride + 1)  #输出特征图大小,用x原始尺度计算
    ow =  math.floor((w - kw + 2*padding)/stride + 1) #输出特征图大小,用x原始尺度计算
    out = torch.zeros(n,cout,oh, ow)  #定义输出特征图
    for i in range(0, h-kh+1, stride):
        for j in range(0, w-kw+1, stride):
            region = x[:,:,i:i+kh, j:j+kw] #x上取特征大小为n,cin,kw,kw
            for k in range(cout):  #遍历输出个数个卷积核
                out[:,k,int(i/stride),int(j/stride)] = torch.sum(region * kernel[k]) # n,cin,kh, kw * None, cin, kh,kw
    print(out)
if __name__ == '__main__':
    x = torch.rand(1,3,5,5)
    kernel = torch.rand(4,3,3,3)
    conv(x, kernel, None, 2, 1)
    r = F.conv2d(x, kernel, bias=None, stride=2, padding=1)
    print(r)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值