每日Attention学习15——Cross-Model Grafting Module
模块出处
[CVPR 22] [link] [
](https://github.com/iCVTEAM/PGNet) 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 torch
class CMGM(nn.Module):
def __init__(self, dim, num_heads=8, qkv_bias=True, qk_scale=None):
super().__init__()
self.num_heads = num_heads
head_dim = dim // num_heads
self.scale = qk_scale or head_dim ** -0.5
self.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: torch.Tensor, y: torch.Tensor):
样本数量 batch_count 被定义为张量x的第一个维度大小
通道数 channel 被定义为张量x的第二个维度大小
张量sc被赋值为张量x的内容
将张量x展平并重新排列形状为(batch_count × channel × -1),然后将其维度顺序从(0→第一个维度)、(2→第三个维度)、(1→第二个维度)进行重新排列
张量sc又被赋值为变换后的结果
张量x被应用了lnx操作
将张量y展平并重新排列形状为(batch_count × channel × -1),然后将其维度顺序从(0→第一个维度)、(2→第三个维度)、(1→第二个维度)进行重新排列
张量y被应用了lny操作
B等于x的形状参数N乘以C
k函数作用于y得到结果并将其重塑为四维张量随后映射至第五维
qv函数作用于输入数据并对结果进行相应的维度调整以获取查询向量和其他相关向量
将qv的结果拆分为两个部分分别对应查询向量和值向量
更新k路径上的表示为第一步计算得到的结果
通过点积运算生成初步的注意力权重矩阵并在缩放因子的作用下完成初始计算
对得到的概率分布进行归一化处理以确保各关注点的概率总和不超过预设阈值
最后通过线性变换将经过关注机制处理后的特征重新映射回原始空间从而完成整个过程的关键步骤
x = self.proj(x)
x = (x+sc1)
将三维索引从(0,1,2)调整至(0,2,1),进而完成对二维切片的操作;随后通过对指定通道数进行重塑(reshape),以满足后续网络结构的需求;接着在经过第二个卷积层后将其输出与原输入信号相加以增强特征提取能力;最后通过自注意力机制计算注意力权重矩阵并对结果进行激活处理以完成最终输出
若主程序启动,则执行以下操作:
生成随机张量x(尺寸为[ batch_size=1 channels=64 height=H=352 width=W=352 ])
生成随机张量y(尺寸与x一致)
创建CMGM模型(参数包括维度设置为64)
调用模型处理输入x和y得到输出结果out
输出结果如下:
out的第一个维度代表特征图尺寸为[ batch_size=?
channels=64 height=H'=352 width=W'=352 ]
out的第二个维度代表交叉注意力矩阵尺寸为[ batch_size=?
channels_cross attends=8 height_hcwhw=(H//downsampling_ratio)2=(352//8)2= (44)^2 ]
* * *
