当前位置: 首页 > news >正文

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版本&#xff1a…...

文件上传攻击骚操作

允许直接上传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设置取消系统闹钟

系统闹钟包名&#xff1a;com.android.deskclock 调用系统闹钟&#xff0c;首先在清单文件AndroidManifest.xml中添加权限&#xff1a; <uses-permission android:name"com.android.alarm.permission.SET_ALARM" />设置系统闹钟&#xff1a; public static v…...

使用 Node.js 多进程提高任务执行效率

什么是 Node 多进程&#xff1f; Node 是在单个线程中运行&#xff0c;我们虽然没办法开启额外的线程&#xff0c;但是可以开启进程集群。这样可以让下载任务和上传任务同时进行。 使用多进程进行初步代码优化 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 高频操作技巧,建议收藏

在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作&#xff0c;有时需要对数据增删字段。 下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序、数据的修改、数据迭代以及函数的使用 文章目录技术交流01、复杂查询1、逻辑运算2、逻辑筛选数据3、函数筛…...

pygraphviz安装教程

0x01. 背景 最近在做casual inference&#xff0c;做实验时候想因果图可视化&#xff0c;遂需要安装pygraphviz&#xff0c;整了一下午&#xff0c;终于捣鼓好了&#xff0c;真头大。 环境&#xff1a; win10操作系统python3.9环境 0x02. 安装Graphviz 传送门&#xff1a;…...

HarmonyOS Connect认证测试

在HarmonyOS Connect生态产品的认证测试过程中&#xff0c;你是否存在这些疑问&#xff1a;认证流程具体包括哪些操作环节&#xff1f;如何根据实际场景选择合适的认证方式&#xff1f;如何选择认证测试标准的版本…… 本期FAQ为大家带来HarmonyOS Connect认证测试的常见问题…...

Datawhale团队第九期录取名单!

Datawhale团队 公示&#xff1a;Datawhale团队成员Datawhale成立四年了&#xff0c;从一开始的12个人&#xff0c;学习互助&#xff0c;到提议成立开源组织&#xff0c;做更多开源的事情&#xff0c;帮助更多学习者&#xff0c;也促使我们更好地成长。于是有了我们的使命&#…...

ChatGPT 的原理与未来研究方向

1、原理&#xff1a; 架构&#xff1a;chatGPT是一种基于转移学习的大型语言模型&#xff0c;它使用GPT-3.2 &#xff08;Generative PretrainedTransformer2&#xff09;模型的技术&#xff0c;使用了transformer的架构&#xff0c;并进行了进一步的训练和优化。InstructGPT/…...

基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架主入口main解析

文章目录1 main.py主入口2 testcase目录2.1 实例&#xff1a;test\_test\_mymusic.py2.2 实例&#xff1a;test\_toolbar.py3 page目录3.1 page/mymusic.py3.2 page/toolbar.py注&#xff1a; 1、本文为本站首发&#xff0c;他用请联系作者并注明出处&#xff0c;谢谢&#xff…...

华为OD机试真题Python实现【挑选字符串】真题+解题思路+代码(20222023)

挑选字符串 题目 给定a-z,26 个英文字母小写字符串组成的字符串A和B, 其中A可能存在重复字母,B不会存在重复字母, 现从字符串A中按规则挑选一些字母可以组成字符串B 挑选规则如下: 同一个位置的字母只能挑选一次, 被挑选字母的相对先后顺序不能被改变, 求最多可以同时…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...