【深度学习】爱因斯坦求和约定(einsum)
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∑kAikBkj=AikBkj
省略掉中间带求和符号的表达式就是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)相关推荐
- 一文掌握爱因斯坦求和约定 einsum
爱因斯坦跟 NumPy 有关系吗?没有,但他提出了一个针对数学公式的符号简化办法,即爱因斯坦求和约定(Einstein Summation Convention)或者叫爱因斯坦标记法(Einstein ...
- tf.einsum—爱因斯坦求和约定
1. einsum记法 如果你像我一样,发现记住PyTorch/TensorFlow中那些计算点积.外积.转置.矩阵-向量乘法.矩阵-矩阵乘法的函数名字和签名很费劲,那么einsum记法就是我们的救星 ...
- np.einsum(爱因斯坦求和约定)
欢迎关注我的微信公号:小张Python einsum 全称 Einstein summation convention(爱因斯坦求和约定),用简单的方式来代表多维数组运算: 矩阵求各元素之和 A=∑i ...
- 爱因斯坦求和约定 含代码einsum
目录 一.简介 1.哑标 2.自由标 二.torch实现 1.计算迹 2.取矩阵对角线 3.计算外积 4.batch矩阵乘法 5.带有子列表和省略号 6.变换维度 7.双线性变换,类似于torch.n ...
- MindSpore爱因斯坦求和约定API解析【mindspore.ops.Einsum】
官方文档写了个寂寞,既非中文也只有示例没有解释,这谁看得懂?总体而言,这个API功能强大,但是,撰写API文档技术有待提高哈.接下来是本人实际测试该API的结果: 符号和参数: mindspore.o ...
- 深度学习矩阵乘法的终极奥义einsum,结合多个计算框架上的使用
点击下方标题,迅速定位到你感兴趣的内容 前言 爱因斯坦求和约定 einsum介绍 einsum应用 TensorFlow.PyTorch和Numpy 其他乘法 前言 说明:讲解时会对相关文章资料进行思 ...
- einsum爱因斯坦求和(numpy)
0. 爱因斯坦求和约定(Einstein Notation) 在数学中,爱因斯坦求和约定是一种标记法,也称为Einstein Summation Convention,在处理关于坐标的方程式时十分有效 ...
- TensorRT - 喜大普奔,TensorRT8.2 EA起开始支持Einsum爱因斯坦求和算子
1 TensorRT 8.2 EA版本支持爱因斯坦求和算子Einsum NVIDIA在2021年10月6日发布的TensorRT新版本 8.2 Early Access版本终于开始支持爱因斯坦求和算子 ...
- python 笔记:爱因斯坦求和 einsum
1 einsum简介 使用爱因斯坦求和约定,可以以简单的方式表示许多常见的多维线性代数数组运算. 给定两个矩阵A和B,我们想对它们做一些操作,比如 multiply.sum或者transpose等.虽 ...
最新文章
- 隔行如隔山 -- 乱弹技术,经济,对日外包
- 【django轻量级框架】(Python3.6.8+Django2.0)第一个Django项目与基础环境搭建
- [deviceone开发]-Star分享的优惠券商户管理端App开源
- 牛客 - 汉诺塔(思维+dp)
- 【传智播客】JavaWeb程序设计任务教程 第四章练习答案
- mysql数据库的备份和二进制日志恢复
- java虚拟机规范阅读(三)异常
- python搭建selenium_自动化测试之路3-selenium3+python3环境搭建
- Android导航栏ActionBar的具体分析
- Redis知识点笔记总结
- 自旋锁、排队自旋锁、MCS锁、CLH锁
- 数据分析——鸢尾花数据集
- 车牌号识别php+sdk,车牌识别SDK
- 反垃圾邮件企业邮箱设置(TXT记录)
- android 9.0 c7Pro,透心凉!三星Galaxy C7 Pro上线,还内置热管
- java pdf 修改内容_Java PDFBox – 读取和修改带有特殊字符的pdf(变音符号)
- SpringMVC POI导出EXCEL
- matlab fpga 移植,使用MATLAB,Simulink以及基于模型的设计实现把电机控制算法移植到Zynq平台...
- 分享几个Vue案例供大家一起学习
- python cv2摄像头校准,坐标系转换
热门文章
- B/S(WEB)系统中使用websocket插件调用扫描仪实现连续扫描并上传图像(IE文件扫描并自动上传)
- 海外问卷调查答题技巧,纯干货分享,新手小白看过来
- Win10安装net framework 3.5出现错误代码0x80072f8f
- xshell使用技巧小节
- XP日文输入法IME/文件打包下载
- WIN10-微软输入法添加日语或者其他语言
- Vue进阶(二):Vue 项目文件结构介绍
- 玩家任务表(每个玩家应该有14条任务记录,需要根据任务配置表补全玩家任务表,原有记录不能修改把每人缺失的任务记录补上)
- 有理函数积分超详细讲解
- PTA--结构体: 7-2 节约有理