概述
官方文档写了个寂寞,既非中文也只有示例没有解释,这谁看得懂?总体而言,这个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.]
最后
以上就是风中过客为你收集整理的MindSpore爱因斯坦求和约定API解析【mindspore.ops.Einsum】符号和参数:实验前准备:示例:1.矩阵某一维度的相乘求和:的全部内容,希望文章能够帮你解决MindSpore爱因斯坦求和约定API解析【mindspore.ops.Einsum】符号和参数:实验前准备:示例:1.矩阵某一维度的相乘求和:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复