我是靠谱客的博主 风中过客,最近开发中收集的这篇文章主要介绍MindSpore爱因斯坦求和约定API解析【mindspore.ops.Einsum】符号和参数:实验前准备:示例:1.矩阵某一维度的相乘求和:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

官方文档写了个寂寞,既非中文也只有示例没有解释,这谁看得懂?总体而言,这个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.矩阵某一维度的相乘求和:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部