einops和einsum:直接操作张量的利器
einops和einsum:直接操作张量的利器
einops和einsum是Vision Transformer的代码实现里出现的两个操作tensor维度和指定tensor计算的神器,在卷积神经网络里不多见,本文将介绍简单介绍一下这两样工具,方便大家更好地理解Vision Transformer的代码。
einops:直接操作tensor维度的神器
github地址:https://github.com/arogozhnikov/einops
einops:灵活和强大的张量操作,可读性强和可靠性好的代码。支持numpy、pytorch、tensorflow等。
有了他,研究者们可以自如地操作张量的维度,使得研究者们能够简单便捷地实现并验证自己的想法,在Vision Transformer等需要频繁操作张量维度的代码实现里极其有用。
这里简单地介绍几个最常用的函数。
安装
einops的安装非常简单,直接pip即可:
pip install einops
rearrange
import torch
from einops import rearrangei_tensor = torch.randn(16, 3, 224, 224) # 在CV中很常见的四维tensor: (N,C,H,W)
print(i_tensor.shape)
o_tensor = rearrange(i_tensor, 'n c h w -> n h w c')
print(o_tensor.shape)
输出:
torch.Size([16, 3, 224, 224])
torch.Size([16, 224, 224, 3])
在CV中很常见的四维tensor:(N,C,H,W),即表示(批尺寸,通道数,图像高,图像宽),在Vision Transformer中,经常需要对tensor的维度进行变换操作,rearrange函数可以很方便地、很直观地操作tensor的各个维度。
除此之外,rearrange还有稍微进阶一点的玩法:
i_tensor = torch.randn(16, 3, 224, 224)
o_tensor = rearrange(i_tensor, 'n c h w -> n c (h w)')
print(o_tensor.shape)
o_tensor = rearrange(i_tensor, 'n c (m1 p1) (m2 p2) -> n c m1 p1 m2 p2', p1=16, p2=16)
print(o_tensor.shape)
输出:
torch.Size([16, 3, 50176])
torch.Size([16, 3, 14, 16, 14, 16])
可以进行指定维度的合并和拆分,注意拆分时需要在变换规则后面指定参数。
repeat
from einops import repeati_tensor = torch.randn(3, 224, 224)
print(i_tensor.shape)
o_tensor = repeat(i_tensor, 'c h w -> n c h w', n=16)
print(o_tensor.shape)
repeat时记得指定右侧repeat之后的维度值
输出:
torch.Size([3, 224, 224])
torch.Size([16, 3, 224, 224])
reduce
from einops import reducei_tensor = torch.randn((16, 3, 224, 224))
o_tensor = reduce(i_tensor, 'n c h w -> c h w', 'mean')
print(o_tensor.shape)
o_tensor_ = reduce(i_tensor, 'b c (m1 p1) (m2 p2) -> b c m1 m2 ', 'mean', p1=16, p2=16)
print(o_tensor_.shape)
输出:
torch.Size([3, 224, 224])
torch.Size([16, 3, 14, 14])
reduce时记得指定左侧要被reduce的维度值
Rearrange
import torch
from torch.nn import Sequential, Conv2d, MaxPool2d, Linear, ReLU
from einops.layers.torch import Rearrangemodel = Sequential(Conv2d(3, 64, kernel_size=3),MaxPool2d(kernel_size=2),Rearrange('b c h w -> b (c h w)'), # 相当于 flatten 展平的作用Linear(64*15*15, 120), ReLU(),Linear(120, 10)
)i_tensor = torch.randn(16, 3, 32, 32)
o_tensor = model(i_tensor)
print(o_tensor.shape)
输出:
torch.Size([16, 10])
einops.layers.torch.Rearrange 是nn.Module的子类,可以放在网络里面直接当作一层。
torch.einsum:爱因斯坦简记法
爱因斯坦简记法:是一种由爱因斯坦提出的,对向量、矩阵、张量的求和运算 ∑\sum∑ 的求和简记法。
在该简记法当中,省略掉的部分是:
- 求和符号 ∑\sum∑
- 求和号的下标 iii
省略规则为:默认成对出现的下标(如下例1中的 iii 和例2中的 kkk )为求和下标,被省略。
1)xiyix_iy_ixiyi简化表示内积 <x,y><\mathbf{x},\mathbf{y}><x,y>
xiyi:=∑ixiyi=ox_iy_i := \sum_i x_iy_i = o xiyi:=i∑xiyi=o
其中o为输出。
- 用 XikYkjX_{ik}Y_{kj}XikYkj 简化表示矩阵乘法 XY\mathbf{X}\mathbf{Y}XY
XikYkj:=∑kXikYkj=OijX_{ik}Y_{kj}:=\sum_k X_{ik}Y_{kj}=\mathbf{O}_{ij} XikYkj:=k∑XikYkj=Oij
其中 Oij\mathbf{O}_{ij}Oij 为输出矩阵的第ij个元素。
这样的求和简记法,能够以一种统一的方式表示各种各样的张量运算(内积、外积、转置、点乘、矩阵的迹、其他自定义运算),为不同运算的实现提供了一个统一模型。
einsum在numpy和pytorch中都有实现,下面我们以在torch中为例,展示一下最简单的用法
import torchi_a = torch.randn(16, 32, 4, 8)
i_b = torch.randn(16, 32, 8, 16)out = torch.einsum('b h i j, b h j d -> b h i d', i_a, i_b)
print(out.shape)
输出:
torch.Size([16, 32, 4, 16])
可以看到,torch.einsum可以简便地指定tensor运算,输入的两个tensor维度分别为 bhijb\ h\ i\ jb h i j 和 bhjdb\ h\ j\ db h j d ,经过tensor运算后,得到的张量维度为 bhidb\ h\ i\ db h i d 。代码运行结果与我们的预期一致。
einops和einsum:直接操作张量的利器相关推荐
- 优雅的操作张量维度(rearrange)和便携式矩阵乘法(einsum )
目录 1.rearrange 2.repeat 3.reduce 4.附录 4.1 对应图像块切片 4.2 嵌入到pytorch层中 4.3 torch.einsum 多维线性表达式的方法 einop ...
- 滴滴开源小桔棱镜:一款专注移动端操作行为的利器
一.棱镜是什么? 小桔棱镜是一款专注于移动端操作行为的工具,涵盖APP操作回放.操作检测.以及数据可视化能力.本篇我们会从产品设计理念和技术实现思路上对棱镜进行整体介绍. 功能结构图 二.为什么要做棱 ...
- JS操作图片的利器:Jimp VS GM
前段时间,笔者有一个项目需求,需要在一张图片上面添加文件,并另存为一张新的图片.刚开始的时候,笔者使用的是大名鼎鼎的jimp. . 其功能能满足我的要求,而且其license是MIT,不依赖于第三方的 ...
- Vision Transformer(ViT)PyTorch代码全解析(附图解)
Vision Transformer(ViT)PyTorch代码全解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单.本文将根 ...
- 【解析】Vision Transformer 在图像分类中的应用
An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale 代码:https://github.com/goog ...
- PyTorch Cookbook by Eric
1 致谢 感谢以下博主的博文: CVHub-cvhuber -- <PyTorch 常用代码段汇总> 2 Philosophy 2.1 使用in-place操作 在代码写作时,尽量使用in ...
- Tensorflow |(2)张量的阶和数据类型及张量操作
Tensorflow |(1)初识Tensorflow Tensorflow |(2)张量的阶和数据类型及张量操作 张量的阶和数据类型 TensorFlow用张量这种数据结构来表示所有的数据.你可以把 ...
- pytorch张量操作基础
张量是pytorch的基本数据类型,因此有必要重新快速的学习下怎么使用操作张量. 1:使用tensor直接创建 b = torch.tensor([[11, 22, 33, 66], [77, 44, ...
- 张量的基本概念+张量的聚合、拼接、比较、随机化采样、序列化等操作+升维、降维
张量的基本概念+张量的聚合.拼接.比较.随机化采样.序列化等操作 一.张量的基本概念 二.张量的聚合操作 三.张量的拼接操作 张量的升维.降维 一.张量的基本概念 张量(Tensor),就是多维数组. ...
最新文章
- WCF的三个名称/命名空间,你是否傻傻分不清楚?
- JAVA----------------------华为机试--------------------------删除字符串中出现次数最少的字符...
- 重构—改善既有代码的设计
- 我的硬盘居然被win10安装工具_安装win10无法识别硬盘,你需要这样做!网友:涨知识了...
- [转载]Mac使用vim命令修改配置文件内容
- mysql function 参数默认值_MySQL参数log_bin_trust_function_creators介绍
- 重温html5的新增的标签和废除的标签
- Uploading SSH public key ... failed!
- C++银行账户管理程序2
- warp-transducer,warprnnt_tensorflow
- 树莓派官方系统安装教程
- ORACLE语句基本优化
- 计算机二级多少人优秀,计算机二级各科通过率是多少
- 鸿蒙系统安装第三方,网友表示:鸿蒙最新系统可以通过连接U盘安装第三方软件了...
- 11.投资管理流程与投资者需求
- 云南省软考报名时间成绩查询云南省教育考试院云南省人事考试网报名入口
- 【香蕉oi】耍望节(数位DP+倍增优化)
- 2014Esri中国开发者大会——SQL操作Geodatabase
- java自学:Severlet和HTTP请求协议
- java英语单词总结