“左边是以逗号隔开的下标索引,重复出现的索引即是需要_p">
赞
踩
爱因斯坦求和是一种对求和公式简洁高效的记法,其原则是当变量下标重复出现时,即可省略繁琐的求和符号。
比如求和公式:
其中变量 a 与变量 b 的下标是相同的(即重复出现),则可将其记为:
einsum方法正是利用了爱因斯坦求和简介高效的表示方法,从而可以驾驭任何复杂的矩阵计算操作。基本的框架如下:
C = einsum('ij,jk->ik', A, B)
上述操作表示矩阵A与矩阵B的点积。输入的参数分为两部分,前面表示计算操作的字符串,后面是以逗号隔开的操作对象(数量需与前面对应)。其中在计算操作表示中,"->“左边是以逗号隔开的下标索引,重复出现的索引即是需要爱因斯坦求和的;”->"右边的是最后输出的结果形式。
以上式为例,其计算公式为: ,其等价于矩阵A与B的点积。
这里有几条原则需要注意,之后也会和结合示例进行详解:
einsum方法在numpy和pytorch中均有内置,这里以pytorch为例,首先定义一些需要用到的变量:
- import torch
- from torch import einsum
- a = torch.ones(3,4)
- b = torch.ones(4,5)
- c = torch.ones(6,7,8)
- d = torch.ones(3,4)
- x, y = torch.randn(5), torch.randn(5)
- einsum('i,j', a) # 等价于einsum('i,j->', a)
- einsum('i,j,k', c)
einsum('ii', a)
einsum('ii->i', a)
einsum('i,j->ij', x, y)
einsum('ij,jk->ik', a, b)
einsum('ij,ij->ij', a, d)
- einsum('ijk->ikj', c)
- einsum('...jk->...kj', c) # 两种形式等价
- A = torch.randn(3,5,4)
- l = torch.randn(2,5)
- r = torch.randn(2,4)
- torch.einsum('bn,anm,bm->ba', l, A, r)
- c = torch.tensor([[[[1., 2.],
- [3., 1.]],
- [[1., 1.],
- [4., 1.]],
- [[1., 1.],
- [1., 5.]]],
- [[[1., 2.],
- [3., 1.]],
- [[1., 1.],
- [4., 1.]],
- [[1., 1.],
- [1., 5.]]]]
- )
- d = torch.tensor([0.1, 0.2, 0.3])
- print(c.shape)
- e = torch.einsum('...chw,c->...hw', c,d)
- print(e)
- print(e.shape)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。