einsum爱因斯坦求和(numpy)
0. 爱因斯坦求和约定(Einstein Notation)
在数学中,爱因斯坦求和约定是一种标记法,也称为Einstein Summation Convention,在处理关于坐标的方程式时十分有效。简单来说,爱因斯坦求和就是简化掉求和式中的求和符号,即
$ \Sigma $, 这样就会使公式更加简洁,如
Numpy是Python中的一个重要的科学计算库,支持大量的多维数组计算,并提供了大量的运算函数库。Numpy率先将爱因斯坦求和以扩展函数的方式引入(np.einsum),而多维数组的特性又非常符合深度学习中张量(Tensor)的特性,因此,基于Numpy,TensorFlow、PyTorch等深度学习框架也纷纷将einsum作为其拓展函数,与Numpy相比,tf和torch中参与运算的张量具有梯度,可以进行反向传播。
对于张量/矩阵运算,einsum几乎无所不能,以下以Numpy为例,来说明其典型用法,PyTorch和TensorFlow中的用法大同小异。
1. 转置
import numpy as np
a = np.arange(0, 9).reshape(3, 3)
print(a)
b = np.einsum('ij->ji', a)
print(b)Output:
a: [[0 1 2][3 4 5][6 7 8]]
b: [[0 3 6][1 4 7][2 5 8]]
2. 全部元素求和
import numpy as np
a = np.arange(0, 9).reshape(3, 3)
print(a)
b = np.einsum('ij->', a)
print(b)Output:
a: [[0 1 2][3 4 5][6 7 8]]
b: 36
3. 某一维度求和
$ sum=\sum_i A_{ij} $
import numpy as np
a = np.arange(0, 9).reshape(3, 3)
print(a)
b = np.einsum('ij->i', a)
print(b)Output:
a: [[0 1 2][3 4 5][6 7 8]]
b: [ 3 12 21]
4. 矩阵对应维度相乘(广播形式)
import numpy as np
a = np.arange(0, 12).reshape(3, 4)
print(a)
b = np.arange(0, 4).reshape(4)
print(b)
c = np.einsum('ij,j->ij', a, b)
print(c)Output:
a: [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
b: [0 1 2 3]
c: [[ 0 1 4 9][ 0 5 12 21][ 0 9 20 33]]
5. 矩阵对应维度相乘(求和形式)
import numpy as np
a = np.arange(0, 12).reshape(3, 4)
print(a)
b = np.arange(0, 4).reshape(4)
print(b)
c = np.einsum('ij,j->i', a, b)
print(c)Output:
a: [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
b: [0 1 2 3]
c: [14 38 62]
6. 矩阵点积
import numpy as np
a = np.arange(0, 12).reshape(3, 4)
print(a)
b = np.arange(0, 12).reshape(3, 4)
print(b)
c = np.einsum('ij,ij->', a, b)
print(c)Output:
a: [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
b: [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
c: 506
7. 矩阵外积(相乘)
import numpy as np
a = np.arange(0, 12).reshape(3, 4)
print(a)
b = np.arange(0, 12).reshape(4, 3)
print(b)
c = np.einsum('ik,kj->ij', a, b)
print(c)Output:
a: [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
b: [[ 0 1 2][ 3 4 5][ 6 7 8][ 9 10 11]]
c: [[ 42 48 54][114 136 158][186 224 262]]
8. Tensor实例中的应用(PyTorch)
情境如下:
有两个tensor A和B,size都是[16, 8, 5, 128, 128],想将两者的第2个维度,即size为5的维度,分别reshape为5x1和1x5的两个向量,然后计算外积,得到一个5x5的kernel。但是,在张量中进行这样的运算,同时保持其他维度不受影响,是比较困难的,而einsum可以完美就觉这种情况。
首先,A可以view成一个size为[18, 8, 5, 1, 128, 128]的tensor, 同理,B可以view为size为[16, 8, 1, 5, 128, 128]的tensor,此时,结果为可以表示为
这是一个复杂版的乘法,相对应的PyTorch代码如下:
import torch
A = torch.randn(16, 8, 5, 128, 128)
B = torch.randn(16, 8, 5, 128, 128)
print('A:', A.size())
print('B:', B.size())
A = A.unsqueeze(3)
B = B.unsqueeze(2)
print('Viewed A:', A.size())
print('Viewed B:', B.size())
C = torch.einsum('ijklno,ijlmno->ijkmno', [A, B])
print('C:', C.size())Output:
A: torch.Size([16, 8, 5, 128, 128])
B: torch.Size([16, 8, 5, 128, 128])
Viewed A: torch.Size([16, 8, 5, 1, 128, 128])
Viewed B: torch.Size([16, 8, 1, 5, 128, 128])
C: torch.Size([16, 8, 5, 5, 128, 128])
einsum爱因斯坦求和(numpy)相关推荐
- np.einsum(爱因斯坦求和约定)
欢迎关注我的微信公号:小张Python einsum 全称 Einstein summation convention(爱因斯坦求和约定),用简单的方式来代表多维数组运算: 矩阵求各元素之和 A=∑i ...
- tf.einsum—爱因斯坦求和约定
1. einsum记法 如果你像我一样,发现记住PyTorch/TensorFlow中那些计算点积.外积.转置.矩阵-向量乘法.矩阵-矩阵乘法的函数名字和签名很费劲,那么einsum记法就是我们的救星 ...
- TensorRT - 喜大普奔,TensorRT8.2 EA起开始支持Einsum爱因斯坦求和算子
1 TensorRT 8.2 EA版本支持爱因斯坦求和算子Einsum NVIDIA在2021年10月6日发布的TensorRT新版本 8.2 Early Access版本终于开始支持爱因斯坦求和算子 ...
- python 笔记:爱因斯坦求和 einsum
1 einsum简介 使用爱因斯坦求和约定,可以以简单的方式表示许多常见的多维线性代数数组运算. 给定两个矩阵A和B,我们想对它们做一些操作,比如 multiply.sum或者transpose等.虽 ...
- 爱因斯坦求和约定在Python扩展库Numpy中的实现
推荐教材: <Python数据分析.挖掘与可视化>(慕课版)(ISBN:978-7-115-52361-7),董付国,人民邮电出版社,定价49.8元,2020年1月出版,2021年12月第 ...
- einsum方法详解(爱因斯坦求和)
einsum方法详解(爱因斯坦求和) einsum是pytorch.numpy中一个十分优雅的方法,如果利用得当,可完全代替所有其他的矩阵计算方法,不过这需要一定的学习成本.本文旨在详细解读einsu ...
- 一文掌握爱因斯坦求和约定 einsum
爱因斯坦跟 NumPy 有关系吗?没有,但他提出了一个针对数学公式的符号简化办法,即爱因斯坦求和约定(Einstein Summation Convention)或者叫爱因斯坦标记法(Einstein ...
- 爱因斯坦求和约定 含代码einsum
目录 一.简介 1.哑标 2.自由标 二.torch实现 1.计算迹 2.取矩阵对角线 3.计算外积 4.batch矩阵乘法 5.带有子列表和省略号 6.变换维度 7.双线性变换,类似于torch.n ...
- 【深度学习】爱因斯坦求和约定(einsum)
import tensorflow as tf print(tf.__version__) 2.0.0 一.爱因斯坦求和约定(einsum)的介绍 爱因斯坦求和约定是一种对复杂张量运算的优雅表达方式. ...
最新文章
- tcp 的ack, seq
- 启明云端分享|sigmastar SSW101B WiFi 非信令测试说明
- 进程锁 读写文件的小例子 C++代码
- java并发编程之Thread.sleep方法详解
- 手把手教你设计交友网站【3】
- 虚拟现实果真来了吗?
- 10月24号、25号、26号三天PC端云音乐项目总结
- js上传本地文件到oss
- 联通光纤服务器没有响应怎么办,联通光纤猫断线无法上网等问题不一样的解决方案...
- 脉脉行业头条业务的思路猜想
- 复习两个月能考上研吗?
- c语言 打字游戏,打字游戏初级版——C语言
- Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon‘
- 树莓派基础实验18:声音传感器实验
- c语言两个for语句并列执行_c语言中for循环 和嵌套for循环
- MEM/MBA数学强化(02)实数运算与性质
- C++指针遍历数组解析
- 用nero刻录时收到错误信息:please ask your administrator to install 'Nero BurnRight'
- 插件分享 | 可以查看摄像头快照的“Hikvision插件”
- 为什么支付宝不怕你欠债?
热门文章
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
- oracle 系统检查点,检查点(Checkpoint)优化及故障排除指南
- Tensorflow--代码1
- mysql私房菜_老男孩MySQL私房菜深入浅出精品视频第7章备份与恢复基础实践视频课程...
- python使用ide_python使用什么ide?[关闭]
- 周二直播丨Oracle数据库SQL执行计划的取得和解析
- openEuler Summit 带你解锁开源与操作系统的不解之缘
- 云端之战:Thomas Kurian离职,Java 11趋向收费,Ellison豪赌ERP和云数据库
- 极速体验:Oracle 18c 下载和Scalable Sequence新特性
- 云小课|ModelArts Pro 视觉套件:零代码构建视觉AI应用