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)相关推荐

  1. np.einsum(爱因斯坦求和约定)

    欢迎关注我的微信公号:小张Python einsum 全称 Einstein summation convention(爱因斯坦求和约定),用简单的方式来代表多维数组运算: 矩阵求各元素之和 A=∑i ...

  2. tf.einsum—爱因斯坦求和约定

    1. einsum记法 如果你像我一样,发现记住PyTorch/TensorFlow中那些计算点积.外积.转置.矩阵-向量乘法.矩阵-矩阵乘法的函数名字和签名很费劲,那么einsum记法就是我们的救星 ...

  3. TensorRT - 喜大普奔,TensorRT8.2 EA起开始支持Einsum爱因斯坦求和算子

    1 TensorRT 8.2 EA版本支持爱因斯坦求和算子Einsum NVIDIA在2021年10月6日发布的TensorRT新版本 8.2 Early Access版本终于开始支持爱因斯坦求和算子 ...

  4. python 笔记:爱因斯坦求和 einsum

    1 einsum简介 使用爱因斯坦求和约定,可以以简单的方式表示许多常见的多维线性代数数组运算. 给定两个矩阵A和B,我们想对它们做一些操作,比如 multiply.sum或者transpose等.虽 ...

  5. 爱因斯坦求和约定在Python扩展库Numpy中的实现

    推荐教材: <Python数据分析.挖掘与可视化>(慕课版)(ISBN:978-7-115-52361-7),董付国,人民邮电出版社,定价49.8元,2020年1月出版,2021年12月第 ...

  6. einsum方法详解(爱因斯坦求和)

    einsum方法详解(爱因斯坦求和) einsum是pytorch.numpy中一个十分优雅的方法,如果利用得当,可完全代替所有其他的矩阵计算方法,不过这需要一定的学习成本.本文旨在详细解读einsu ...

  7. 一文掌握爱因斯坦求和约定 einsum

    爱因斯坦跟 NumPy 有关系吗?没有,但他提出了一个针对数学公式的符号简化办法,即爱因斯坦求和约定(Einstein Summation Convention)或者叫爱因斯坦标记法(Einstein ...

  8. 爱因斯坦求和约定 含代码einsum

    目录 一.简介 1.哑标 2.自由标 二.torch实现 1.计算迹 2.取矩阵对角线 3.计算外积 4.batch矩阵乘法 5.带有子列表和省略号 6.变换维度 7.双线性变换,类似于torch.n ...

  9. 【深度学习】爱因斯坦求和约定(einsum)

    import tensorflow as tf print(tf.__version__) 2.0.0 一.爱因斯坦求和约定(einsum)的介绍 爱因斯坦求和约定是一种对复杂张量运算的优雅表达方式. ...

最新文章

  1. tcp 的ack, seq
  2. 启明云端分享|sigmastar SSW101B WiFi 非信令测试说明
  3. 进程锁 读写文件的小例子 C++代码
  4. java并发编程之Thread.sleep方法详解
  5. 手把手教你设计交友网站【3】
  6. 虚拟现实果真来了吗?
  7. 10月24号、25号、26号三天PC端云音乐项目总结
  8. js上传本地文件到oss
  9. 联通光纤服务器没有响应怎么办,联通光纤猫断线无法上网等问题不一样的解决方案...
  10. 脉脉行业头条业务的思路猜想
  11. 复习两个月能考上研吗?
  12. c语言 打字游戏,打字游戏初级版——C语言
  13. Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon‘
  14. 树莓派基础实验18:声音传感器实验
  15. c语言两个for语句并列执行_c语言中for循环 和嵌套for循环
  16. MEM/MBA数学强化(02)实数运算与性质
  17. C++指针遍历数组解析
  18. 用nero刻录时收到错误信息:please ask your administrator to install 'Nero BurnRight'
  19. 插件分享 | 可以查看摄像头快照的“Hikvision插件”
  20. 为什么支付宝不怕你欠债?

热门文章

  1. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
  2. oracle 系统检查点,检查点(Checkpoint)优化及故障排除指南
  3. Tensorflow--代码1
  4. mysql私房菜_老男孩MySQL私房菜深入浅出精品视频第7章备份与恢复基础实践视频课程...
  5. python使用ide_python使用什么ide?[关闭]
  6. 周二直播丨Oracle数据库SQL执行计划的取得和解析
  7. openEuler Summit 带你解锁开源与操作系统的不解之缘
  8. 云端之战:Thomas Kurian离职,Java 11趋向收费,Ellison豪赌ERP和云数据库
  9. 极速体验:Oracle 18c 下载和Scalable Sequence新特性
  10. 云小课|ModelArts Pro 视觉套件:零代码构建视觉AI应用