论文阅读:Non-local Neural Networks

论文地址:https://arxiv.org/pdf/1711.07971.pdf

内容简介
  • 主要讨论下提出来的non-local block
non-local block

直译下来叫“非局部块”。长这样:
在这里插入图片描述
既然叫“非局部”那就看看什么叫做“局部”。所谓局部指的就是感受野,比如卷积核的大小。一般来说我们使用的都是如3×3的小尺寸卷积核,所以只能提取小范围的信息。

而为了克服这种局面,获取更大范围(比如两个较远像素)之间蕴含的信息,就可以用文章中提出的non local结构。

具体的流程是这样的:

  • 对于输入的特征图(假设是1024通道),用1个1×1卷积将其降维至512通道(更通用的讲,降一半),以供备用,记为 g g g
  • 同样,分别用2个1×1卷积处理输入特征图,记为 θ \theta θ ϕ \phi ϕ
  • θ \theta θ ϕ \phi ϕ做矩阵乘,得到的结果类似于协方差矩阵,包含自相关性信息
  • 对该结果做softmax,获得的权重就相当于self attention系数
  • 与g相乘,升维,再与原始输入x残差相加,得到最后结果

代码长这样:

class NonLocal(nn.Module):
    def __init__(self, channel):
        super(NonLocalBlock, self).__init__()
        self.inter_channel = channel // 2
        self.conv_phi = nn.Conv2d(channel, self.inter_channel, 1, 1, 0, False)
        self.conv_theta = nn.Conv2d(channel, self.inter_channel, 1, 1, 0, False)
        self.conv_g = nn.Conv2d(channel, self.inter_channel, 1, 1, 0, False)
        self.softmax = nn.Softmax(dim=1)
        self.conv_mask = nn.Conv2d(self.inter_channel, channel, 1, 1, 0, False)

    def forward(self, x):
        b, c, h, w = x.size()
        x_phi = self.conv_phi(x).view(b, c, -1)
        x_theta = self.conv_theta(x).view(b, c, -1).permute(0, 2, 1).contiguous()
        x_g = self.conv_g(x).view(b, c, -1).permute(0, 2, 1).contiguous()
        mul_theta_phi = torch.matmul(x_theta, x_phi)
        mul_theta_phi = self.softmax(mul_theta_phi)
        mul_theta_phi_g = torch.matmul(mul_theta_phi, x_g)
        mul_theta_phi_g = mul_theta_phi_g.permute(0, 2, 1).contiguous().view(b, self.inter_channel, h, w)
        mask = self.conv_mask(mul_theta_phi_g)
        out = mask + x 
        return out
参考

https://mp.weixin.qq.com/s/FFEKWFgScdBZ8snZQLdfFg

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值