12.13 深度学习-卷积的注意力机制通道注意力SKNet

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

# **Selective Kernel Networks** 可选择的  卷积核尺寸
# SK是对SE的改进版,可以动态调整感受野巨细
import torch
import os
import torch.nn as nn
from torchvision.models import resnet18,ResNet18_Weights
from torchvision.models.resnet import _resnet,BasicBlock,_ovewrite_named_param,ResNet

path=os.path.dirname(__file__)
onnxpath=os.path.join(path,"assets/resnet_SE-Identity.onnx")
onnxpath=os.path.relpath(onnxpath)

class SKNet(nn.Module):
    def __init__(self,inplanes, r=16,*args, **kwargs):
        super().__init__(*args, **kwargs)
        d=max(inplanes//r,32)
        # 先并行 做两个卷积 CHW稳固
        self.conv3x3=nn.Sequential(nn.Conv2d(inplanes,inplanes,kernel_size=3,padding=1),nn.ReLU())
        self.conv5x5=nn.Sequential(nn.Conv2d(inplanes,inplanes,kernel_size=5,padding=2),nn.ReLU())
        self.pool=nn.AdaptiveAvgPool2d(1) # 全局池化
        self.fc=nn.Sequential(nn.Linear(inplanes,d),nn.ReLU()) # 线性 有缩放因子
        # 两个全连接 然后两个全连接的效果 堆叠在一起 在0轴上做一个softmax 由于这两个全连接的softmax效果对应位置要分别+起来为一 分别约束就是
        # softmax 不会改变原tensor的外形 只是给tensor的值改为一个概率分布
        self.fca=nn.Linear(d,inplanes)
        self.fcb=nn.Linear(d,inplanes)

    def forward(self,x):
        x1=self.conv3x3(x)
        x2=self.conv5x5(x)
        # 两个卷积效果相加
        U=x1+x2
        F_gp=self.pool(U)
        F_fc=self.fc(F_gp.view(F_gp.shape[0],-1))
        a=self.fca(F_fc)
        b=self.fcb(F_fc)
        aandb=torch.stack((a,b),dim=0)
        aandb=torch.softmax(aandb,dim=0)
        a=aandb[0].unsqueeze(dim=2).unsqueeze(3)
        b=aandb[1].unsqueeze(dim=2).unsqueeze(3)
        x1=x1*a
        x2=x2*b

        return x1+x2
   
img1=torch.rand(8,128,224,224)
sk1=SKNet(img1.size(1))
res=sk1(img1)
print(res.shape)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表