Pytorch深度学习实战3-4:通俗理解张量Tensor的爱因斯坦求和(附实例)
目录
- 1 爱因斯坦求和由来
- 2 爱因斯坦求和原理
- 3 实例:字母表示法
- 3.1 向量运算
- 3.2 矩阵运算
- 3.3 张量运算
- 4 实例:常量表示法
- 4.1 向量运算
- 4.2 矩阵运算
- 4.3 张量运算
1 爱因斯坦求和由来
爱因斯坦求和约定(Einstein summation convention)是一种标记的约定,又称为爱因斯坦标记法(Einstein notation),在处理关于坐标的方程式时非常有用。这约定是由阿尔伯特·爱因斯坦于1916年提出的。后来,爱因斯坦与友人半开玩笑地说:“这是数学史上的一大发现,若不信的话,可以试着返回那不使用这方法的古板日子。”
采用爱因斯坦求和约定,可以使数学表达式显得简洁明快。
在深度学习中经常涉及高阶张量运算,普通代数方法(如矩阵乘法)相对冗杂,因此引入爱因斯坦求和约定,其核心原理是将张量下标划分为自由标(free index)和哑标(dummy index),通过遍历自由标而对哑标逐元相乘求和的方式进行张量运算。
2 爱因斯坦求和原理
爱因斯坦求和原理并不复杂,具体而言,可以用下图来通俗理解,定义:
- 自由标:在输入输出侧都出现且各出现一次的索引号;
- 哑标:只在输入侧出现且出现两次的索引号。
输入、输出索引号的个数表示各参与运算张量的维度,例如下图表示两个二维张量做求和运算输出一个二维张量。

3 实例:字母表示法
3.1 向量运算
# ============================ 一维张量 ================================
a = torch.tensor([1, 2, 3], dtype=float)
b = torch.tensor([4, 5, 6], dtype=float)# 向量内积
print("向量内积:", torch.einsum("i, i ->", a, b))
# 向量点乘
print("向量点乘:",torch.einsum("i, i -> i", a, b))
结果如下:
>>> 向量内积: tensor(32., dtype=torch.float64)
>>> 向量点乘: tensor([ 4., 10., 18.], dtype=torch.float64)
3.2 矩阵运算
# ============================ 二维张量 ================================
c = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=float)
d = torch.ones((3, 4), dtype=float)# 矩阵乘法
print("矩阵乘法:", torch.einsum("ij, jk -> ik", c, d))
# 转置
print("矩阵转置:", torch.einsum("ij -> ji", c))
# 迹
print("迹:", torch.einsum("ii ->", c))
# 对角元
print("对角元:", torch.einsum("ii -> i", c))
# 矩阵按行求和
print("矩阵按行求和:", torch.einsum("ij -> j", c))
# 矩阵按列求和
print("矩阵按列求和:", torch.einsum("ij -> i", c))
# 矩阵所有元素求和
print("矩阵所有元素求和:", torch.einsum("ij ->", c))
# 矩阵乘向量
print("矩阵乘向量:", torch.einsum("ij, j -> i", c, a))
结果如下:
>>> 矩阵乘法: tensor([[ 6., 6., 6., 6.],[15., 15., 15., 15.],[24., 24., 24., 24.]], dtype=torch.float64)
>>> 矩阵转置: tensor([[1., 4., 7.],[2., 5., 8.],[3., 6., 9.]], dtype=torch.float64)
>>> 迹: tensor(15., dtype=torch.float64)
>>> 对角元: tensor([1., 5., 9.], dtype=torch.float64)
>>> 矩阵按行求和: tensor([12., 15., 18.], dtype=torch.float64)
>>> 矩阵按列求和: tensor([ 6., 15., 24.], dtype=torch.float64)
>>> 矩阵所有元素求和: tensor(45., dtype=torch.float64)
>>> 矩阵乘向量: tensor([14., 32., 50.], dtype=torch.float64)
3.3 张量运算
# ============================ 高阶张量 ================================
e = torch.arange(60.).reshape(5, 3, 4)
f = torch.arange(24.).reshape(2, 4, 3)# 三维张量压缩
print("三维张量压缩:", torch.einsum("kij, lji -> kl", e, f))
结果如下:
>>> 三维张量压缩: tensor([[ 440., 1232.],[ 1232., 3752.],[ 2024., 6272.],[ 2816., 8792.],[ 3608., 11312.]])
4 实例:常量表示法
以下结果同第三节,不再赘述
4.1 向量运算
'''
索引表示法
(张量后接输入索引, 最后是输出索引)
'''
# ============================ 一维张量 ================================
a = np.array([1, 2, 3], dtype=float)
b = np.array([4, 5, 6], dtype=float)# 向量内积
print("向量内积:", np.einsum(a, [0], b, [0]))
# 向量点乘
print("向量点乘:",np.einsum(a, [0], b, [0], [0]))
4.2 矩阵运算
# ============================ 二维张量 ================================
c = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=float)
d = np.ones((3, 4), dtype=float)# 矩阵乘法
print("矩阵乘法:", np.einsum(c, [0, 1], d, [1, 2], [0, 2]))
# 转置
print("矩阵转置:", np.einsum(c, [0, 1], [1, 0]))
# 迹
print("迹:", np.einsum(c, [0, 0]))
# 对角元
print("对角元:", np.einsum(c, [0, 0], [0]))
# 矩阵按行求和
print("矩阵按行求和:", np.einsum(c, [0, 1], [1]))
# 矩阵按列求和
print("矩阵按列求和:", np.einsum(c, [0, 1], [0]))
# 矩阵所有元素求和
print("矩阵所有元素求和:", np.einsum(c, [0, 1]))
# 矩阵乘向量
print("矩阵乘向量:", np.einsum(c, [0, 1], a, [1], [0]))
4.3 张量运算
# ============================ 高阶张量 ================================
e = np.arange(60.).reshape(5, 3, 4)
f = np.arange(24.).reshape(2, 4, 3)# 三维张量压缩
print("三维张量压缩:", np.einsum(e, [2, 0, 1], f, [3, 1, 0], [2, 3]))
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《Pytorch深度学习实战》
- 《机器学习强基计划》
- 《运动规划实战精讲》
- …
相关文章:
Pytorch深度学习实战3-4:通俗理解张量Tensor的爱因斯坦求和(附实例)
目录1 爱因斯坦求和由来2 爱因斯坦求和原理3 实例:字母表示法3.1 向量运算3.2 矩阵运算3.3 张量运算4 实例:常量表示法4.1 向量运算4.2 矩阵运算4.3 张量运算1 爱因斯坦求和由来 爱因斯坦求和约定(Einstein summation convention)是一种标记的约定&#…...
GEE学习笔记 五十六:GEE中如何把文件导出到Google Drive的子目录
今天在群里看到有人在问一个问题,如何使用GEE把文件导出到Google Drive的子目录中?这里我就简单的说一下这个问题。 首先,在GEE中我们都知道了如何将数据导出导出Google Drive的文件夹中,如下面的一个例子: var geome…...
【Go基础】数据库编程
文章目录1. SQL语法简介2. MySQL最佳实践3. Go SQL驱动接口解读4. 数据库增删改查5. stmt6. SQLBuilder6.1 Go-SQLBuilder6.2 Gendry6.3 自行实现SQLBuilder7. GORM8. Go操作MongoDB1. SQL语法简介 SQL(Structured Query Language)是一套语法标准&#…...
【颠覆软件开发】华为自研IDE!未来IDE将不可预测!
IDE是软件开发生态的入口,但目前我们所使用的IDE基本都是由国外巨头提供,比如Visual Studio、Eclipse、JetBrains。这些IDE具有很高的断供风险,与操作系统、芯片、编程语言一样,非常重要。 随着越来越多的软件开始采用云上开发模…...
怎样从零基础学黑客
可以说想学黑客技术,要求你首先是一个“T”字型人才,也就是说电脑的所有领域你都能做的来,而且有一项是精通的。因此作为一个零基础的黑客爱好者来说,没有良好的基础是绝对不行的,下面我就针对想真正学习黑客的零基础朋…...
burp小程序抓包
身为一名码农,抓包肯定是一项必备技能。工作中遇到很多次需要对小程序进行抓包排查问题。下面分享一下我的抓包方式,使用的是电脑版小程序抓包,跟手机的方式都差不多的。 一、环境 微信版本:3.6.0.18 Burpsuite版本:…...
文件上传攻击骚操作
允许直接上传shell 只要有文件上传功能,那么就可以尝试上传webshell直接执行恶意代码,获得服务器权限,这是最简单也是最直接的利用。 允许上传压缩包 如果可以上传压缩包,并且服务端会对压缩包解压,那么就可能存在Zip …...
Scala流程控制(第四章:分支控制、嵌套分支、switch分支、for循环控制全、while与do~while、多重与中断)
文章目录第 4 章 流程控制4.1 分支控制 if-else4.1.1 单分支4.1.2 双分支4.1.3 多分支4.2 嵌套分支4.3 Switch 分支结构4.4 For 循环控制4.4.1 范围数据循环(To)4.4.2 范围数据循环(Until)4.4.3 循环守卫4.4.4 循环步长4.4.5 嵌套…...
华为OD机试真题Python实现【整理扑克牌】真题+解题思路+代码(20222023)
整理扑克牌 题目 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请安如下规则对这一组扑克牌进行整理。 步骤一: 对扑克牌进行分组,规则如下 当牌面数字相同张数大于等于4时,组合牌为炸弹;三张相同牌面数字+两张相同牌面数字,且三张牌与两张牌不相同时,组合牌…...
【春秋云境】CVE-2022-28525
靶标介绍: ED01-CMS v20180505 存在任意文件上传漏洞 打开靶场: 盲猜一波弱密码admin:admin就进去了。登录后在图中位置点击进行图片更新,需要将密码等都写上 抓包将图片信息进行替换,并修改文件名: POST /admin…...
Android设置取消系统闹钟
系统闹钟包名:com.android.deskclock 调用系统闹钟,首先在清单文件AndroidManifest.xml中添加权限: <uses-permission android:name"com.android.alarm.permission.SET_ALARM" />设置系统闹钟: public static v…...
使用 Node.js 多进程提高任务执行效率
什么是 Node 多进程? Node 是在单个线程中运行,我们虽然没办法开启额外的线程,但是可以开启进程集群。这样可以让下载任务和上传任务同时进行。 使用多进程进行初步代码优化 const dl require(./download.js) const ul require(./upload…...
[Golang实战]github.io部署个人博客hugo[新手开箱可用][小白教程]
[Golang实战]github.io部署个人博客hugo[新手开箱可用][小白教程]1.新手教程(小白也能学会)2.开始准备2.1myBlog是hugo的项目1.安装Hugo2.创建hugo项目2.2 xxxx.github.io是github.io中规定的pages项目3.成功部署4.TODO自动化workflows部署github.io1.新手教程(小白也能学会) …...
50个 Pandas 高频操作技巧,建议收藏
在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作,有时需要对数据增删字段。 下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用 文章目录技术交流01、复杂查询1、逻辑运算2、逻辑筛选数据3、函数筛…...
pygraphviz安装教程
0x01. 背景 最近在做casual inference,做实验时候想因果图可视化,遂需要安装pygraphviz,整了一下午,终于捣鼓好了,真头大。 环境: win10操作系统python3.9环境 0x02. 安装Graphviz 传送门:…...
HarmonyOS Connect认证测试
在HarmonyOS Connect生态产品的认证测试过程中,你是否存在这些疑问:认证流程具体包括哪些操作环节?如何根据实际场景选择合适的认证方式?如何选择认证测试标准的版本…… 本期FAQ为大家带来HarmonyOS Connect认证测试的常见问题…...
Datawhale团队第九期录取名单!
Datawhale团队 公示:Datawhale团队成员Datawhale成立四年了,从一开始的12个人,学习互助,到提议成立开源组织,做更多开源的事情,帮助更多学习者,也促使我们更好地成长。于是有了我们的使命&#…...
ChatGPT 的原理与未来研究方向
1、原理: 架构:chatGPT是一种基于转移学习的大型语言模型,它使用GPT-3.2 (Generative PretrainedTransformer2)模型的技术,使用了transformer的架构,并进行了进一步的训练和优化。InstructGPT/…...
基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架主入口main解析
文章目录1 main.py主入口2 testcase目录2.1 实例:test\_test\_mymusic.py2.2 实例:test\_toolbar.py3 page目录3.1 page/mymusic.py3.2 page/toolbar.py注: 1、本文为本站首发,他用请联系作者并注明出处,谢谢ÿ…...
华为OD机试真题Python实现【挑选字符串】真题+解题思路+代码(20222023)
挑选字符串 题目 给定a-z,26 个英文字母小写字符串组成的字符串A和B, 其中A可能存在重复字母,B不会存在重复字母, 现从字符串A中按规则挑选一些字母可以组成字符串B 挑选规则如下: 同一个位置的字母只能挑选一次, 被挑选字母的相对先后顺序不能被改变, 求最多可以同时…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

