PyTorch中matmul函数的矩阵相乘原则和注意事项

PyTorch中matmul函数的矩阵相乘原则和注意事项

一、高维张量乘法规则

1. 选择乘法的维度: 选择最后两个维度进行乘
2. 维度匹配规则: 最后两个维度按照普通矩阵乘法计算
3. 广播机制:torch.matmul 函数支持广播机制,即在满足乘法维度匹配规则的前提下,可以通过扩展(广播)其他维度来实现矩阵相乘。这使得可以对不同形状的张量进行相乘。

4. 结果张量的形形状:

最后2维为矩阵乘法正常计算完成应该有的维度,而高维则以参与计算的两个矩阵中,维度更大的那个矩阵的维度为准。

为什么是这样,因为其实高维矩阵的乘法就是分别从高维中选取对应位置的一对矩阵(普通矩阵)相乘把高维都遍历完了,整个高维矩阵乘法也就完成了。

那么原参与计算的矩阵形状,高维有多大,计算结果就应该有多大(因为高维只遍历)

⭐⭐⭐一言以蔽之:除最后两维外,每一维的分量数必须对应相等(每个分量对应相乘) 或 有一方为1(broadcast-广播机制)

二、二维矩阵相乘

线性代数基本知识,就不多讲了

import torch# 创建两个二维矩阵
A = torch.tensor([[1, 2],[3, 4]])
B = torch.tensor([[5, 6],[7, 8]])# 使用 matmul 进行二维矩阵相乘
C = torch.matmul(A, B)
print("二维矩阵相乘结果:")
print(C)

输出结果:

二维矩阵相乘结果:
tensor([[19, 22],[43, 50]])

三、三维张量相乘

对于两个三维张量 A 和 B,我们可以选择其中的最后两个维度进行相乘。

import torch# 创建两个三维张量
A = torch.randn(2, 3, 4)
B = torch.randn(2, 4, 5)# 使用 matmul 进行三维张量相乘
C = torch.matmul(A, B)
print("三维张量相乘结果的形状:")
print(C.shape)

输出结果:

三维张量相乘结果的形状:
torch.Size([2, 3, 5])

在这个示例中,张量 A 的形状是 [2, 3, 4],张量 B 的形状是 [2, 4, 5],我们对最后两个维度进行了矩阵相乘,得到的结果张量 C 的形状是 [2, 3, 5]

四、三维张量广播相乘示例

import torch# 创建两个可以广播的张量
a = torch.randn(2, 3, 4)
b = torch.randn(4, 5)# 使用 torch.matmul 进行广播机制的矩阵乘法
result = torch.matmul(a, b)
print("广播机制下的矩阵乘法结果的形状:")
print(result.sha

输出

广播机制下的矩阵乘法结果的形状:
torch.Size([2, 3, 5])

五、高维张量相乘

最后,我们考虑更高维度的情况,例如四维张量。对于四维张量 A 和 B,我们选择最后两个维度进行相乘。

# 创建两个四维张量
A = torch.randn(2, 3, 4, 5)
B = torch.randn(2, 3, 5, 6)# 使用 matmul 进行四维张量相乘
C = torch.matmul(A, B)
print("四维张量相乘结果的形状:")
print(C.shape)

输出结果:

四维张量相乘结果的形状:
torch.Size([2, 3, 4, 6])

在这个示例中,张量 A 的形状是 [2, 3, 4, 5],张量 B 的形状是 [2, 3, 5, 6],我们对最后两个维度进行了矩阵相乘,得到的结果张量 C 的形状是 [2, 3, 4, 6]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springweb添加traceId

上面要求添加 traceId,需求很简单。 唯一的难点是,jakarta.servlet.http.HttpServletRequest 不支持直接 put 请求头。 所以需要创建一个可修改的对象,包装请求。 另外,由于我们应用还使用了 openFeign ,需要将 traceId 传递进去。…

vue3开发过程中遇到的一些问题记录

问题: vue3在使用 defineProps、defineEmits、defineExpose 时不需要import,但是 eslint会报错error defineProps is not defined no-undef 解决方法: 安装 vue-eslint-parser 插件,在 .eslintrc.js 文件中添加配置 parser: vue-e…

python中的json库常见使用总结

一、数据加载 1、json.loads() 接受一个包含JSON数据的字符串作为参数,从字符串中加载JSON数据。 import json json_string {"name":"Alice","age":30,"is_student":false,"hobbies":["reading",&…

计算机网络期末复习6(武夷学院版)略看

第6章 应用层 应用层是TCP/IP协议栈的最高层,直接面向用户,为各种网络应用提供服务。以下是一些典型的应用层协议的基本概念和主要使用的端口。 1. HTTP(HyperText Transfer Protocol) 基本概念:用于万维网上的数据…

Windows 组策略编辑器怎么打开,这两种方法你必须知道

组策略编辑器(Group Policy Editor, 简称 GPEdit.msc)是 Windows 操作系统中一个强大的工具,主要用于管理和配置系统设置、安全选项、用户权限等,尤其适用于企业环境中批量部署和管理策略。 尽管家庭版 Windows(如 Win…

Flink分区和窗口操作

分区(Partitioning)与分组(Grouping): 分区: 将数据流划分为多个子流,每个子流由一个或多个子任务处理。通过 keyBy 操作实现,根据键对数据进行分区。数据具体去往哪个分区,是通过…

解锁Memcached的Key长度极限:深入探索与实践

🔑 解锁Memcached的Key长度极限:深入探索与实践 Memcached是一种广泛使用的高性能分布式内存缓存系统,它通过减少数据库的读取次数来提高应用程序的性能。在Memcached中,每个缓存项都通过一个唯一的key来标识。然而,对…

秋招Java后端开发冲刺——并发篇1(线程与进程、多线程)

一、进程 1. 进程 进程是程序的一次动态执行过程,是操作系统资源分配的基本单位。 2. 进程和线程的区别 特性进程线程定义独立运行的程序实例,资源分配的基本单位进程中的一个执行单元,CPU调度的基本单位资源进程拥有独立的内存空间和资源线…

ubuntu安装miniconda、jupyer、ros2

miniconda: 类似于虚拟机 ,可以安装不同版本的python jupyer: python执行、调试命令工具 1.下载安装文件 wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-x86_64.sh 2.安装minconda bash https://repo.anaconda.com/miniconda/Miniconda3-py…

傅雷家书思维导图的制作方法,分享制作技巧和软件!

在浩如烟海的书海中,《傅雷家书》以其独特的视角和深厚的情感,成为了无数读者心中的经典。那么,如何将这部饱含父爱的书信集转化为清晰易懂的思维导图呢?本文将为您详细解读傅雷家书思维导图的制作技巧,并推荐几款实用…

能自动铲屎的养猫救星?带你了解热门爆款智能猫砂盆的真实体验!

在谈论猫咪的日常生活时,我和朋友最经常聊的话题就是在各种各样的紧急情况下如何狼狈地赶回去给猫咪铲屎,毕竟猫砂盆里的屎但凡停留那么几小时,就要开始发臭了,一下班回去实在受不了那个味道,每次下班在家门口都想带个…

gemma2 vllm和ollama推理部署;openai接口调用、requests调用

参考: https://huggingface.co/google/gemma-2-9b https://ai.google.dev/gemma/docs/model_card_2?hl=zh-cn https://huggingface.co/blog/gemma2 发布了两个型号9B\27B 支持上下文长度有点短:4096 1、 ollama推理部署 升级ollama: curl -fsSL https://ollama.com/…

AVL许可证与版权保护

在数字化时代,知识产权保护成为企业发展的重要保障。AVL许可证与版权保护的关系密不可分,共同为企业筑起坚实的防线。本文将深入探讨AVL许可证在版权保护中的重要性、作用以及最佳实践,帮助企业更好地维护自身知识产权。 一、AVL许可证在版权…

高三才考试努力,请记住这些个学习方法,助你华丽逆袭

站在人生的十字路口,高三是整个人生中重要的转折点,这一年的学习成果直接影响我们未来的人生走向。站在我们求学生涯的高度上,高三也是特殊的一年,因为我们要用一整年的时间去复习旧知识。   如果你到了高三改意识到自己需要努力…

AMSA-UNet | 基于自注意力的多尺度 U-Net 提升图像去模糊性能

前言 传统的单尺度U-Net在去模糊过程中常常会导致空间信息的丢失,这影响了去模糊的准确性。此外,由于卷积方法在捕捉长距离依赖方面的局限性,恢复图像的质量下降。为了解决上述问题,提出了一种基于自注意力的非对称多尺度U-Net(AMSA-UNet)来提高去模糊方法在准确性和计算…

修改Springboot项目名称

修改Springboot项目名称 1. 整体描述2. 具体步骤2.1 修改module名称2.2 修改程序包名2.3 mybatis/mybatis-plus配置修改2.4 logback文件2.5 yml配置2.6 Application启动类2.7 其他 3. 总结 1. 整体描述 开发过程中,经常遇到新来个项目,需要一份初始代码…

【前端】HTML+CSS复习记录【5】

文章目录 前言一、padding、margin、border(边框边距)二、样式优先级三、var(使用 CSS 变量更改多个元素样式)四、media quary(媒体查询)系列文章目录 前言 长时间未使用HTML编程,前端知识感觉…

去中心化革命:探索区块链技术的前沿

随着信息技术的飞速发展,区块链技术作为一种新兴的去中心化解决方案,正逐渐改变着我们的经济、社会和技术格局。本文将从区块链的基本原理、当前的应用实例以及未来的发展趋势三个方面,深入探讨区块链技术在革命性变革中的角色和影响。 1. 区…

构建工程化:建立平台化工程体系

一、功能描述 工程化体系主要是解决能够统一进行打包的问题,故需要对整体进行描述 1.1、子项目描述 1.1.1、配置管理 对于每一个子项目而言,需要有专门的配置管理目录,目录的建议组建方式为conf/defalut和conf/local,其中defa…

TypeScript中,如何利用数组生成一个联合类型

本文由 ChatMoney团队出品 在开发中我们常常会遇到这样一个问题,代码如下: const arr ["a","b","c","d","e","f","g","h","i","j","k&quo…