醋醋百科网

Good Luck To You!

「解析」如何优雅的学习 torch.einsum()

einsum方法解析

Einsum 是爱因斯坦在研究广义相对论时,需要处理大量求和运算,为了简化这种繁复的运算,提出了求和约定,推动了张量分析的发展,具有重要意义!einsum 在Pytorch、TensorFlow、numpy中一个十分优雅的方法。Einsum 可以计算向量、矩阵、张量运算,包括计算 transposes、sum、column/row sum、Matrix-Vector Multiplication、Matrix-Matrix Multiplication。如果利用得当,sinsum绝对是你科研路上的一把利器,可完全代替其他的矩阵计算方法。

1、einsum 公式约定

爱因斯坦求和是一种对求和公式简洁高效的记法

其原则是当变量下标重复出现时,即可省略繁琐的求和符号。

比如 矩阵点积 公式:



哑标: 必须是重复一次的,且在每一项中的重复次数不能多于1次;含义就是虚设的指标,只是临时性的,经过求和之后就消失了;
自由标: 在表达式的每一项中,出现一次 且 仅出现一次,用同一字母,表示方程或变量的数目,并不作求和运算;

Einsum 标记的约定

  1. 维度分量下标:张量的维度分量下标使用英文字母表示,不区分大小写,如’ijk’表示张量维度分量为i,j,k
  2. 下标对应输入操作数:维度下标以,分段,按顺序1-1对应输入操作数
  3. 广播维度:省略号...表示维度的广播分量,例如,‘i…j’ 表示首末分量除外的维度需进行广播对齐
  4. 自由标和哑标:输入标记中仅出现一次的下标为自由标,重复出现的下标为哑标,哑标对应的维度分量将被规约消去
  5. 输出:输出张量的维度分量既可由输入标记自动推导,也可以用输出标记定制化
  • 自动推导输出

广播维度分量位于维度向量高维位置,自由标维度分量按字母顺序排序,位于维度向量低纬位置,哑标维度分量不输出

  • 定制化输出

若输出包含广播维度,则输出标记需包含...

哑标出现在输出标记中则自动提升为自由标

输出标记中未出现的自由标被降为哑标

# 自由标
for i in range(3):
	for j in range(4):
		for l in range():
			# 哑标 求和过程
			total = 0
			for k in range(5):
				total += A[i,j,k] * B[k,l]
			M[i,j] = total

2、torch.einsum() 方法原理

Sums the product of the elements of the input operands along dimensions specified using a notation based on the Einstein summation convention.

einsum方法正是利用了爱因斯坦求和简介高效的表示方法,从而可以驾驭任何复杂的矩阵计算操作。基本的框架如下:

C = einsum('ij,jk->ik', A, B)

上述操作表示矩阵A与矩阵B的点积。

输入的参数分为两部分

  • equation (str): 求和标记 计算操作的字符串
  • operands (Tensor, [Tensor, …]): 输入张量 操作对象(数量及维度需与前面对应)

3、向量操作

Let A and B be two 1D arrays of compatible shapes (meaning the lengths of the axes we pair together either equal, or one of them has length 1):

4、矩阵操作

Now let A and B be two 2D arrays with compatible shapes:

When working with larger numbers of dimensions, keep in mind that einsum allows the ellipses syntax ‘…’. This provides a convenient way to label the axes we’re not particularly interested in, e.g. np.einsum(’…ij,ji->…’, a, b) would multiply just the last two axes of a with the 2D array b. There are more examples in the documentation.


更多实例请查看

「解析」如何优雅的学习 torch.einsum()_绿色羽毛-CSDN博客

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言