einsum 简介

1、转置

2、沿行或列求和

3、按列求和

4、向量与矩阵相乘

5、矩阵与矩阵相乘

6、阿达马积(遂元遂元乘积)

同阶矩阵相乘

7、矩阵批量相乘

einops简介

C.1 einops简介

张量(Tensor)操作是机器学习、深度学习中的常用操作,这些操作在
NumPy、Tensorflow、PyTorch、Mxnet、Paddle等框架都有相应的函数。比如PyTorch中的review,transpose,permute等操作。
einops是提供常用张量操作的Python包,支持NumPy、Tensorflow、PyTorch等框架,可以与这些框架有机衔接。其功能涵盖了reshape、view、transpose和permute等操作。其特点是可读性强、易维护,如变更轴的顺序的操作。

einops可用pip安装

einops的常用函数:rearrange, reduce, repeat

C.1.1 rearrange

rearrange只改变形状,但不改变元素总个数,其功能涵盖transpose, reshape, stack, concatenate, squeeze 和expand_dims等。
1、导入需要的库

2、自动可视化arrays数据

3、导入测试数据
数据文件下载地址:https://github.com/arogozhnikov/einops/tree/master/docs/resources

(1)测试数据

 

(2)显示第2张图

4、交互维度

5、轴的拼接
涵盖Stack and concatenate等功能。

6、轴的拆分
(1)拆分batch轴

(2)拆分与拼接(concatenate)

(3)对width轴进行拆分

7、重新拼接轴

8、沿轴增加或减少一个维度
覆盖这些函数的功能:Squeeze and unsqueeze (expand_dims)

(6, 1, 96, 96, 1, 3)
(6, 96, 96, 3)

C.1.2 reduce

沿轴求平均值,最大值、最小值等。

C.1.3 repeat

在某轴上重复n次。

C.2 作为pytorch的layer来使用

Rearrange是nn.module的子类,直接可以当作pytorch网络层放到模型里。

C.2.1 展平

这个代码与下代码等价

C.2.2 使用einops可大大简化PyTorch代码

1、构建模型

2、代码1与下面这个代码等价

C.2.3 构建注意力模型

这段代码与下列代码等价

用einops简单明了实现自注意力

1.自注意力(Self-Attention)

Transformer凭借其自注意力机制,有效解决了字符之间或像素之间的长距离依赖,日益称为NLP和CV领域的通用架构。
自注意力机制是Transformer的核心,如何简洁有效实现Self-Attention?这里介绍一种法,使用einops和PyTorch中einsum。自注意力的计算公式如下

2.自注意力计算的详细过程如下图所示


这里假设x的形状(1,4,4),标记(Token)个数为4,每个token转换为长度为4的向量,嵌入(Embedding)的维度为3(dim=3)。

3、详细实现代码

用代码实现上述计算过程

4、测试

运行结果
tensor([[[-0.3127, 0.4551, -0.0695],
[-0.3176, 0.4594, -0.0715],
[-0.3133, 0.4551, -0.0703],
[-0.3116, 0.4531, -0.0702]]], grad_fn=)

einops的使用可参考官网:
https://github.com/arogozhnikov/einops

使用Swin-Transformer模型实现分类任务


使用Swin-Transformer模型实现分类任务
最近几年,Transformer体系结构已成为自然语言处理任务的实际标准,
但其在计算机视觉中的应用还受到限制。在视觉上,注意力要么与卷积网络结合使用,
要么用于替换卷积网络的某些组件,同时将其整体结构保持在适当的位置。2020年10月22日,谷歌人工智能研究院发表一篇题为“An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale”的文章。文章将图像切割成一个个图像块,组成序列化的数据输入Transformer执行图像分类任务。当对大量数据进行预训练并将其传输到多个中型或小型图像识别数据集(如ImageNet、CIFAR-100、VTAB等)时,与目前的卷积网络相比,Vision Transformer(ViT)获得了出色的结果,同时所需的计算资源也大大减少。
2021年3月 微软亚洲研究院 发表的论文《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》被评为ICCV 2021 最佳论文!
论文地址:https://arxiv.org/pdf/2103.14030.pdf
项目地址:https://github.com/microsoft/Swin-Transformer
这篇论文的作者主要包括中国科学技术大学的刘泽、西安交通大学的林宇桐、微软的曹越和胡瀚等人。该研究提出了一种新的 vision Transformer,即 Swin Transformer,它可以作为计算机视觉的通用骨干(Backbone)。在CV各应用领域,如分类、目标检测、语义分割、实例分割等都超过基于CNN的网络性能!人们自然会问,为啥能取得如此好的效果?为什么ViT没有取得这么好的成绩?
第一个问题:
因为Swin Transformer吸收了Transformer的固有优点(如通用性强、并发处理、超长视野等优点,如图1-1所示),同时吸收了CNN的平移不变性、局部性、层次性等优点。

图1-1 卷积神经网络、Transformer架构像素之间的关系
卷积神经网络输出一个像素与输入5个像素点之间建立联系需要经过3个隐含层;而Transformer中输出一个像素点与其他每个像素点建立联系只要一层就可以。
第二个问题:
ViT的计算复杂度没有降低,ViT结构没有层次。如1-2所示:

图1-2 Swin Transformer 与ViT层级结构的异同
Swin Transformer是如何实现这些优点的呢?
1、降低计算复杂度:采用局部性,如图1-2所示,把特征图·划分为不重叠的不同尺寸的窗口,计算自注意力时只在这些窗口内。
2、计算在窗口内,但通过窗口shifted方法,可以把相邻窗口的信息连接起来,如图1-3所示。

图1-3 Swin Transformer中windows shifted 的示意图
通过Windows shifted后的多头注意力计算简称为SW-MSA的具体计算,window
内的多头注意力计算简称为W-MSA,具体位置可参考图1-4。

图1-4 Swin Transformer的架构图
这里我们以Swin Transformer为模型,实现对数据CiFar10的分类工作,模型性能得到进一步的提升。以下为用swin-transformer架构实现一个分类任务的详细代码。

1、导入模型

这里使用了TensorFlow_addons模块,它实现了核心 TensorFlow 中未提供的新功能。
tensorflow_addons的安装要注意与tf的版本对应关系,请参考:
https://github.com/tensorflow/addons。
安装addons时要注意其版本与tensorflow版本的对应,具体关系以上这个链接有。

2、定义加载函数

3、定义批量加载函数

4、加载数据

5、定义数据预处理及训练模型的一些超参数

6、设置一些超参数

7、定义几个辅助函数

8、 定义W-MSA类

9、定义SwinTransformer 模块

10、抽取特征

11、构建模型

12、训练模型

13、可视化运行结果

运行结果

14、测试结果

15、可视化测试结果