对于一副图像,位置信息占有非常重要的地位,ViT中用了绝对位置编码,Swin中用到了相对位置编码。看了Swin的源码,参考了https://blog.csdn.net/qq_37541097/article/details/121119988?spm=1001.2014.3001.5502

博主的博客,有了自己的一点点理解,在这里跟大家分享一下。

一幅图像中,每个像素有自己的绝对位置,也有相对于其他像素的相对位置,上图展示了每个像素相对于其他像素的相对位置。对于大小为H*W的特征图,每个像素相对于其他像素的相对位置最大为H-1,最小为1-H,构建相对位置的代码如下:

coords_h = torch.arange(self.window_size[0])
coords_w = torch.arange(self.window_size[1])
coords = torch.stack(torch.meshgrid([coords_h, coords_w], indexing="ij"))  # [2, Mh, Mw]
coords_flatten = torch.flatten(coords, 1)  # [2, Mh*Mw]
# [2, Mh*Mw, 1] - [2, 1, Mh*Mw]
relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :]  # [2, Mh*Mw, Mh*Mw]
relative_coords = relative_coords.permute(1, 2, 0).contiguous()  # [Mh*Mw, Mh*Mw, 2]

torch.meshgrid的作用是将coords_h和coords_w构造成网格,形成坐标,就相当于生成了绝对位置坐标。然后将绝对位置展平,然后通过

# [2, Mh*Mw, 1] - [2, 1, Mh*Mw]

relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :]  # [2, Mh*Mw, Mh*Mw]

将绝对位置信息转化为相对位置信息。具体做法是将展平后的张量拓展最后一个维度减去张量拓展第一个维度,生成上图的相对位置索引。

但是生成的相对位置索引会有负值,将二维索引变成一维如果将两个维度直接相加,则(-1,0)和(0,-1)是相同的,但是这两个相对位置是不同的。为了解决这个问题,作者用的如下方法:

relative_coords[:, :, 0] += self.window_size[0] - 1  # shift to start from 0
relative_coords[:, :, 1] += self.window_size[1] - 1
relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1
relative_position_index = relative_coords.sum(-1)  # [Mh*Mw, Mh*Mw]
self.register_buffer("relative_position_index", relative_position_index)

将第一维加上self.window_size[0] - 1 第二维加上self.window_size[1] - 1 这样每一维最小为0,最大值为2*self.window_size[0] - 2,然后第一维乘上2*self.window_size[1] - 1,那么现在最大为

(2*self.window_size[0] - 2)*(2*self.window_size[1] - 1) + (2*self.window_size[1]-2) 最小为0

其中self.window_size[0] 可以= self.window_size[1],那么从0到最大值,那就是最大值加1个数,化简后就变为(2*self.window_size[0]-1)(2*self.window_size[1]-1),那么创建的相对位置偏执table大小为(2*self.window_size[0]-1)(2*self.window_size[1]-1)。根据索引,在tabel中找到对应的偏执,然后偏执是可以更新的。

创建偏执table的代码如下:

self.relative_position_bias_table = nn.Parameter(
torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads)) # [2*Mh-1 * 2*Mw-1, nH]
#对于长度为Wh的窗口,相对位置最高为Wh-1,最低为1-Wh,为了不出现负数,做如下处理:
#先将横纵坐标都加上Wh-1,那么横纵坐标最小为0,最大为2*Wh-2,再将其中一维乘以(2*Wh-1),然后横纵坐标相加,这样就可以将所有的位置坐标区分开,
#最后处理的结果中,最小值为0,最大值为(2*Wh-2)*(2*Wh-1)+(2*Wh-2),那么需要创建最大值加一个相对位置参数,因为是从0开始的,化简一下就是(2*Wh-1)*(2*Wh-1)

目前来说相对位置偏执代码就写好了,只需要在求得注意力分数后,将偏执加上就可以了。

transformer中相对位置编码理解相关推荐

  1. 举例理解transformer中的位置编码

    文章目录 1. transformer结构图 2. 位置编码的作用 3. 位置编码的计算 1. transformer结构图 ​ 在transformer的结构图中,由一个"Position ...

  2. 深入理解transformer中的位置编码

    文章目录 总览 问题1 问题2 问题3 问题4 问题5 问题6 总览 我们今天需要讲解transformer中的位置编码,这其实属于进阶内容.既然你会到这里,我默认你已经看过了transformer的 ...

  3. 【Transformer】Transformer 中的位置编码 -- ICLR 2021

    引言 Transformer是近年来非常流行的处理序列到序列问题的架构,其self-attention机制允许了长距离的词直接联系,可以使模型更容易学习序列的长距离依赖.由于其优良的可并行性以及可观的 ...

  4. Transformer中的位置编码(PE,position)

    参考链接 [1]https://blog.csdn.net/qq_34771726/article/details/102918440?utm_medium=distribute.pc_relevan ...

  5. ICCV2021 | Vision Transformer中相对位置编码的反思与改进

    前言  在计算机视觉中,相对位置编码的有效性还没有得到很好的研究,甚至仍然存在争议,本文分析了相对位置编码中的几个关键因素,提出了一种新的针对2D图像的相对位置编码方法,称为图像RPE(IRPE). ...

  6. Transformer正余弦位置编码理解

    在学习Transformer模型过程中不可避免的一个过程便是要对序列进行位置编码,在Transformer中分为固定位置编码与可学习的位置编码,其一般采用固定位置编码中的正余弦位置编码方式. 今天便以 ...

  7. 透彻分析Transformer中的位置编码(positional enconding)

    一.Transformer中为什么要使用位置编码positional encoding 在<Attention Is All You Need>这篇论文中首次提到了transformer模 ...

  8. Transformer架构:位置编码

    2017年,Google的Vaswani 等人提出了一种新颖的纯注意力序列到序列架构,闻名学术界与工业界的 Transformer 架构横空出世.它的可并行化训练能力和优越的性能使其成为自然语言处理领 ...

  9. 【AI理论学习】对Transformer中Positional Encoding的理解

    对Transformer中Positional Encoding的理解 1. 什么是Positional Encoding?为什么Transformer需要使用Positional Encoding? ...

最新文章

  1. matlab处理图像位置,MATLAB图像处理:我的直方图的最后一个位置出现了
  2. SIMILAR:现实场景中基于子模块信息度量的主动学习
  3. inconsistent use of tabs and spaces in indentation
  4. 计算机网络实验(华为eNSP模拟器)——第四章 配置静态路由、动态路由
  5. 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求
  6. Pyspark学习入门二:sort排序学习
  7. 用科学数据求真:地月之间不可能电视直播
  8. Java中的内存模型JMM与线程
  9. 去掉Xcelsius报表在EP展示空白边界
  10. 人工智能成功与冠状病毒抗争,但个人隐私令人担忧
  11. android 调用系统打印
  12. Explain执行计划key_len详解
  13. python下载夏目友人帐
  14. 使用云主机进行深度学习
  15. Vue入门 - 环境搭建Vue项目创建
  16. java swing人机对战五子棋(含背景音乐)
  17. 路由器也可刷机,开源的Tomato DualWAN
  18. 【Lora智慧农业系统】让农民伯伯轻松坐等收割!
  19. unittest框架知识总结
  20. Windbg命令学习16(!gle和g和p)

热门文章

  1. 你也能看懂的:主成分分析法
  2. 最新全国高校考研资料分享
  3. windows10专业版 hyper-v
  4. jotform 设计器_使用JotForm 4.0减轻表单构建的痛苦
  5. 【OpenJudge】反反复复
  6. Python urllib.urlencode
  7. mysql关系运算_数据库关系运算
  8. 五、产业互联网价值——构建“双螺旋”产业结构,实现产业价值指数增长
  9. Linux下2D、3D的测试软件glxgears
  10. 如何安装和配置Mantis