MindSpore爱因斯坦求和约定API解析【mindspore.ops.Einsum】

官方文档写了个寂寞,既非中文也只有示例没有解释,这谁看得懂?总体而言,这个API功能强大,但是,撰写API文档技术有待提高哈。接下来是本人实际测试该API的结果:

符号和参数:

mindspore.ops.Einsum这个API是用于矩阵【也就是所谓的张量tensor】间运算的,它可以完成很多操作,例如矩阵相乘,为了满足这一需求,要求输入必须为tensor,也就说,可以支持矩阵和向量运算,但必须将向量a转化为矩阵[a],也就是1x1。

mindspore.ops.Einsum("{az/AZ},{.../az/AZ}->{az/AZ})

{az/AZ]}你只可以使用a~z及A~Z去代表tensor的维度

,作为一个分隔符,对每个tensor进行分割

->左边是输入维度,右边是你希望输出的维度

看不懂?没关系,下面例子你一看就懂!

实验前准备:

from mindspore import Tensor
import mindspore.numpy as np
from mindspore import ops
import mindspore

示例:

1.矩阵某一维度的相乘求和:

简单一维求和【乘数为1】

x = Tensor(np.array([1.0, 2.0, 4.0]), mindspore.float32)
einsum = ops.Einsum("i->")
#x为(3)的一维tensor,“i->”代表输入为(3)的一维数组,输出为()的零维数组
output = einsum([x])#这里的[]只是为了表示x为tensor,但去掉或者换()就会报错
print(output)
>>>[7.]

二维求和【乘数为1】

x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32)
einsum = ops.Einsum("ij->j")#(2,3)->(3),对应元素相加
output = einsum([x])
print(output)
>>>[5. 7. 9.]

维度对应数字相乘【加和为0】

x = Tensor(np.array([1.0, 2.0, 4.0]), mindspore.float32)
y = Tensor(np.array([2.0, 4.0, 3.0]), mindspore.float32)
einsum = ops.Einsum("i,i->i")#(3)和(3)的矩阵输出(3)
output = einsum((x, y))#x,y相同维度的对应元素相乘
print(output)
>>>[ 2.  8. 12.]

指定维度对应数字相乘再求和

x = Tensor(np.array([1.0, 2.0, 4.0]), mindspore.float32)
y = Tensor(np.array([2.0, 4.0, 3.0]), mindspore.float32)
einsum = ops.Einsum("i,i->")#(3)和(3)的矩阵输出()
output = einsum((x, y))#x,y相同维度的对应元素相乘再求和
print(output)
>>>[22.]

如何取理解什么时候求和,什么时候相加?简单来说,只要涉及到ab两个tensor,中间用“,”隔开,那么必定有相乘运算,根据你指定的维度再视情况进行加和运算。如果只有一个tensor,就不会有相乘运算

2矩阵相乘

矩阵相乘的特殊情况,也就是普普通通的矩阵相乘[a,b]*[b,c]=[a,c]

x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32)
y = Tensor(np.array([[2.0, 3.0], [1.0, 2.0], [4.0, 5.0]]), mindspore.float32)
einsum = ops.Einsum("ij,jk->ik")#(2,3),(3,2)->(2,2)
output = einsum((x, y))
print(output)
>>>[[16. 22.]
 [37. 52.]]
x = Tensor(np.array([1.0, 2.0, 3.0]), mindspore.float32)
y = Tensor(np.array([2.0, 4.0, 1.0]), mindspore.float32)
einsum = ops.Einsum("j,i->ji")#(3),(3)->(3,3)实际上是自动填补了一个维度
#可以理解为(3,1),(1,3)->(3,3)
output = einsum((x, y))
print(output)
>>>[[ 2.  4.  1.]
 [ 4.  8.  2.]
 [ 6. 12.  3.]]

3矩阵的转置

x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32)
einsum = ops.Einsum("ij->ji")#矩阵的转置
output = einsum([x])
print(output)
>>>[[1. 4.]
 [2. 5.]
 [3. 6.]]

4省略号的运用

x = Tensor(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]), mindspore.float32)
einsum = ops.Einsum("...->")#...代表中间全部维度,在此处代表(2,3)
#本表达可以等同与"...j->","i...->"此用法在多维运算中可以常常使用
output = einsum([x])
print(output)
>>>[21.]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值