每日Attention学习15——Cross-Model Grafting Module

ops/2024/9/23 14:29:38/
模块出处

[CVPR 22] [link] [code] Pyramid Grafting Network for One-Stage High Resolution Saliency Detection


模块名称

Cross-Model Grafting Module (CMGM)


模块作用

Transformer与CNN之间的特征融合


模块结构

在这里插入图片描述


模块思想

Transformer在全局特征上更优,CNN在局部特征上更优,对这两者进行进行融合的最简单做法是直接相加或相乘。但是,相加或相乘本质上属于"局部"操作,如果某片区域两个特征的不确定性都较高,则会带来许多噪声。为此,本文提出了CMGM模块,通过交叉注意力的形式引入更为广泛的信息来增强融合效果。


模块代码
import torch.nn.functional as F
import torch.nn as nn
import torchclass CMGM(nn.Module):def __init__(self, dim, num_heads=8, qkv_bias=True, qk_scale=None):super().__init__()self.num_heads = num_headshead_dim = dim // num_headsself.scale = qk_scale or head_dim ** -0.5self.k = nn.Linear(dim, dim , bias=qkv_bias)self.qv = nn.Linear(dim, dim * 2, bias=qkv_bias)self.proj = nn.Linear(dim, dim)self.act = nn.ReLU(inplace=True)self.conv = nn.Conv2d(8,8,kernel_size=3, stride=1, padding=1)self.lnx = nn.LayerNorm(64)self.lny = nn.LayerNorm(64)self.bn = nn.BatchNorm2d(8)self.conv2 = nn.Sequential(nn.Conv2d(64,64,kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.Conv2d(64,64,kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True))def forward(self, x, y):batch_size = x.shape[0]chanel     = x.shape[1]sc = xx = x.view(batch_size, chanel, -1).permute(0, 2, 1)sc1 = xx = self.lnx(x)y = y.view(batch_size, chanel, -1).permute(0, 2, 1)y = self.lny(y)B, N, C = x.shapey_k = self.k(y).reshape(B, N, 1, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)x_qv= self.qv(x).reshape(B,N,2,self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)x_q, x_v = x_qv[0], x_qv[1] y_k = y_k[0]attn = (x_q @ y_k.transpose(-2, -1)) * self.scaleattn = attn.softmax(dim=-1)x = (attn @ x_v).transpose(1, 2).reshape(B, N, C)x = self.proj(x)x = (x+sc1)x = x.permute(0,2,1)x = x.view(batch_size,chanel,*sc.size()[2:])x = self.conv2(x)+xreturn x, self.act(self.bn(self.conv(attn+attn.transpose(-1,-2))))if __name__ == '__main__':x = torch.randn([1, 64, 11, 11])y = torch.randn([1, 64, 11, 11])cmgm = CMGM(dim=64)out1, out2 = cmgm(x, y)print(out1.shape)  # out feature 1, 64, 11, 11print(out2.shape)  # cross attention matrix 1, 8, 121, 121


http://www.ppmy.cn/ops/99979.html

相关文章

ts 自动化编译

1. tsc --init 生成一个 tsconfig.json 的配置文件,其中包含很多编译时的配置 tsc --init 2. tsc --watch 监视目录中的.ts 文件的变化,并生成.js 文件 tsc --watch 3. tsc --noEmitOnError --watch 当编译 ts 文件出错时,不生成.js 文…

百日筑基第六十二天-持续集成和持续交付的 pipeline 概念

百日筑基第六十一天-持续集成和持续交付的 pipeline 概念 在软件开发中,Pipeline 是一种自动化的过程,它包括从开发人员提交代码,到代码构建,测试,部署等一系列的步骤。在持续集成(Continuous Integration…

Pytorch封装简单RNN模型,进行中文训练及文本预测

简述 使用pytorch封装简单RNN模型,使用单层nn.RNN、nn.Linear等实现,然后做简单的文本预测。 数据集 代码参考李沐:https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/rnn-concise.html,但他使用的是一篇英文小说&#…

jvm监控工具一览

下面是对 BTrace、JAD、JMAP、JSTAT、JSTACK、JINFO 以及 MARK 工具的比较表: 工具/属性功能适用场景使用难度是否侵入式是否需要重启 JVMBTrace动态跟踪和监控 Java 应用程序性能分析、故障排查、日志收集、安全监控中等无侵入式否JAD反编译 Java 字节码文件&…

ubuntu 不生成core 的可能原因

一、首先检查 $ cat /proc/sys/kernel/core_pattern $ cat /proc/sys/kernel/core_pattern|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E 系统当前的/proc/sys/kernel/core_pattern设置为: |/usr/share/apport/apport -p%p -s%s -c%c -d…

稳石机器人 | 工业级AMR S1200L,专为多样化需求设计,柔性拓展更易用

近日,稳石机器人重磅推出基于新品控制器ROC1000的全新移动机器人AMR S1200L,专为满足生产制造和仓储物流的多样化需求而设计,无需改造现场,最快可在1周内完成部署。 重载型AMR-S1200L设计注重实用性和灵活性,可在室内…

Springcloud从零开始---Service业务模块(三)

上篇:Springcloud从零开始---Zuul(二)-CSDN博客 Service模块是客户端模块,用户编写业务逻辑代码和功能实现。前端请求发送到Zuul网关再有网关发送到Service服务,可以是系统的安全性提升。 开始继上篇Springcloud从零…

软件测试——设计测试用例

用例 边界值 取边界值次边界值边界值有效则次边界值取有效,二者相反 场景法 这些具体的方法,旨在提高我们的测试思路提高我们设计测试用例的能力 正交表法 1.分析需求 2.使用工具 只填写部分时如何选择 如输入选项有5种,则需要32种&…