import tensorflow as tf
print(tf.__version__)
2.0.0

一、爱因斯坦求和约定(einsum)的介绍

爱因斯坦求和约定是一种对复杂张量运算的优雅表达方式。在实现深度学习模型时,使用爱因斯坦求和约定可以编写更加紧凑和高效的代码。

einsum省略求和符号并隐式累加重复下标和输出未指明的下标。例如将两个矩阵A∈RI×KA\in \mathbb{R}^{I\times K}A∈RI×K和B∈RK×JB\in \mathbb{R}^{K\times J}B∈RK×J相乘,接着计算每列的和,最终得到向量c∈RJc\in \mathbb{R}^Jc∈RJ。使用einsum就可以表示为:

cj=∑i∑kAikBkj=AikBkjc_j = \sum_{i}\sum_{k}A_{ik}B_{kj}=A_{ik}B_{kj}cj​=∑i​∑k​Aik​Bkj​=Aik​Bkj​

省略掉中间带求和符号的表达式就是einsum表达式,其含义是计算行向量Ai,:A_{i,:}Ai,:​按位乘以列向量B:,jB_{:,j}B:,j​,然后求和(由于重复下标k所以求和,这里相当于点积)。这时得到的是两矩阵相乘后的矩阵C∈RI×JC\in \mathbb{R}^{I \times J}C∈RI×J,但是由于表达式指明为cjc_jcj​,因此需要将计算得到的矩阵中的i维度进行求和(因为cjc_jcj​中没有i)。这就实现了上面复杂的张量运算,下面是使用tensorflow计算上面的例子。

A = tf.ones((2,3))
B = tf.ones((3,4))*2
c = tf.einsum("ik,kj->j",A,B)
print(c)
tf.Tensor([12. 12. 12. 12.], shape=(4,), dtype=float32)

二、使用einsum实现深度学习中的常见操作

1.矩阵转置

A = tf.random.uniform((3,4))
B = tf.einsum("ij->ji",A)
print(A.shape)
print(B.shape)
(3, 4)
(4, 3)

2.求和

A = tf.random.uniform((3,4))
print(tf.einsum("ij->",A)) # 所有元素求和
print(tf.einsum("ij->j",A).shape) # 列求和
print(tf.einsum("ij->i",A).shape) # 行求和
tf.Tensor(6.1462874, shape=(), dtype=float32)
(4,)
(3,)

3.乘积

A = tf.random.uniform((2,3))
B = tf.random.uniform((3,4))
print(tf.einsum("ik,kj->ij",A,B).shape) # 矩阵乘法
a = tf.random.uniform((3,))
b = tf.random.uniform((3,))
print(tf.einsum("i,i->",a,b).shape) # 内积
print(tf.einsum("i,j->ij",a,b).shape) # 外积
(2, 4)
()
(3, 3)

4.batch乘法

在深度学习中样本通常是成批次的送到模型中,因此往往需要对每个样本对应的矩阵进行乘法,而由于整个tensor的第1个维度为batch size,因此要实现batch乘法会比较复杂,而使用einsum就非常的简洁。

A = tf.random.uniform((32,128,100))
B = tf.random.uniform((32,100,50))
print(tf.einsum("bsd,bdi->bsi",A,B).shape)
(32, 128, 50)

5.张量缩约

将两个高维张量在某些维度相乘,并在这些维度上求和

A = tf.random.uniform((3,5,7,2,8))
B = tf.random.uniform((4,7,2,3,5))
print(tf.einsum("pqrst,urspq->pqrstu",A,B).shape)
(3, 5, 7, 2, 8, 4)

参考

【深度学习】爱因斯坦求和约定(einsum)相关推荐

  1. 一文掌握爱因斯坦求和约定 einsum

    爱因斯坦跟 NumPy 有关系吗?没有,但他提出了一个针对数学公式的符号简化办法,即爱因斯坦求和约定(Einstein Summation Convention)或者叫爱因斯坦标记法(Einstein ...

  2. tf.einsum—爱因斯坦求和约定

    1. einsum记法 如果你像我一样,发现记住PyTorch/TensorFlow中那些计算点积.外积.转置.矩阵-向量乘法.矩阵-矩阵乘法的函数名字和签名很费劲,那么einsum记法就是我们的救星 ...

  3. np.einsum(爱因斯坦求和约定)

    欢迎关注我的微信公号:小张Python einsum 全称 Einstein summation convention(爱因斯坦求和约定),用简单的方式来代表多维数组运算: 矩阵求各元素之和 A=∑i ...

  4. 爱因斯坦求和约定 含代码einsum

    目录 一.简介 1.哑标 2.自由标 二.torch实现 1.计算迹 2.取矩阵对角线 3.计算外积 4.batch矩阵乘法 5.带有子列表和省略号 6.变换维度 7.双线性变换,类似于torch.n ...

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

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

  6. 深度学习矩阵乘法的终极奥义einsum,结合多个计算框架上的使用

    点击下方标题,迅速定位到你感兴趣的内容 前言 爱因斯坦求和约定 einsum介绍 einsum应用 TensorFlow.PyTorch和Numpy 其他乘法 前言 说明:讲解时会对相关文章资料进行思 ...

  7. einsum爱因斯坦求和(numpy)

    0. 爱因斯坦求和约定(Einstein Notation) 在数学中,爱因斯坦求和约定是一种标记法,也称为Einstein Summation Convention,在处理关于坐标的方程式时十分有效 ...

  8. TensorRT - 喜大普奔,TensorRT8.2 EA起开始支持Einsum爱因斯坦求和算子

    1 TensorRT 8.2 EA版本支持爱因斯坦求和算子Einsum NVIDIA在2021年10月6日发布的TensorRT新版本 8.2 Early Access版本终于开始支持爱因斯坦求和算子 ...

  9. python 笔记:爱因斯坦求和 einsum

    1 einsum简介 使用爱因斯坦求和约定,可以以简单的方式表示许多常见的多维线性代数数组运算. 给定两个矩阵A和B,我们想对它们做一些操作,比如 multiply.sum或者transpose等.虽 ...

最新文章

  1. 隔行如隔山 -- 乱弹技术,经济,对日外包
  2. 【django轻量级框架】(Python3.6.8+Django2.0)第一个Django项目与基础环境搭建
  3. [deviceone开发]-Star分享的优惠券商户管理端App开源
  4. 牛客 - 汉诺塔(思维+dp)
  5. 【传智播客】JavaWeb程序设计任务教程 第四章练习答案
  6. mysql数据库的备份和二进制日志恢复
  7. java虚拟机规范阅读(三)异常
  8. python搭建selenium_自动化测试之路3-selenium3+python3环境搭建
  9. Android导航栏ActionBar的具体分析
  10. Redis知识点笔记总结
  11. 自旋锁、排队自旋锁、MCS锁、CLH锁
  12. 数据分析——鸢尾花数据集
  13. 车牌号识别php+sdk,车牌识别SDK
  14. 反垃圾邮件企业邮箱设置(TXT记录)
  15. android 9.0 c7Pro,透心凉!三星Galaxy C7 Pro上线,还内置热管
  16. java pdf 修改内容_Java PDFBox – 读取和修改带有特殊字符的pdf(变音符号)
  17. SpringMVC POI导出EXCEL
  18. matlab fpga 移植,使用MATLAB,Simulink以及基于模型的设计实现把电机控制算法移植到Zynq平台...
  19. 分享几个Vue案例供大家一起学习
  20. python cv2摄像头校准,坐标系转换

热门文章

  1. B/S(WEB)系统中使用websocket插件调用扫描仪实现连续扫描并上传图像(IE文件扫描并自动上传)
  2. 海外问卷调查答题技巧,纯干货分享,新手小白看过来
  3. Win10安装net framework 3.5出现错误代码0x80072f8f
  4. xshell使用技巧小节
  5. XP日文输入法IME/文件打包下载
  6. WIN10-微软输入法添加日语或者其他语言
  7. Vue进阶(二):Vue 项目文件结构介绍
  8. 玩家任务表(每个玩家应该有14条任务记录,需要根据任务配置表补全玩家任务表,原有记录不能修改把每人缺失的任务记录补上)
  9. 有理函数积分超详细讲解
  10. PTA--结构体: 7-2 节约有理