Pytorch矩阵乘法之torch.mul() 、 torch.mm() 及torch.matmul()的区别

【Pytorch学习】torch.mm()&torch.matmul()和torch.mul()以及torch.spmm() 做深度学习过程中免不了使用pytorch,刚上手可能觉得pytorch是一门新语言。过一段时间之后发现其用法跟python极其相似,python的很多函数名都可以用到torch中。当然也有一些不同,毕竟张量的计算可以用GPU啊。是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵。当然,对于二维的效果等同于torch.mm()。关于torch.matmul的详细介绍可以看。torch.matmul()的用法比torch.mm更高级,的维度必须相等,比如。 阅读详情
AI摘要

本文详细讲解了PyTorch中torch.mul()、torch.mm()和torch.matmul()函数之间的区别,包括适用场景、维度要求和广播机制,帮助读者掌握矩阵相乘的高级用法。

torch.mul() 、 torch.mm() 及torch.matmul()的区别

一、简介

  • torch.mul(a, b) 是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵;
  • torch.mm(a, b) 是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵。
  • torch.bmm() 强制规定维度和大小相同
  • torch.matmul() 没有强制规定维度和大小,可以用利用广播机制进行不同维度的相乘操作

二、具体使用

1、torch.mul(a, b)和torch.mm(a, b)

举例

import torch

a = torch.rand(3, 4)
b = torch.rand(3, 4)
c = torch.rand(4, 5)

print(torch.mul(a, b).size())  # 返回 1*2 的tensor
print(torch.mm(a, c).size())   # 返回 1*3 的tensor
print(torch.mul(a, c).size())  # 由于a、b维度不同,报错

输出

torch.Size([3, 4])
torch.Size([3, 5])
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-27-aea68cb5481f> in <module>
      7 print(torch.mul(a, b).size())  # 返回 1*2 的tensor
      8 print(torch.mm(a, c).size())   # 返回 1*3 的tensor
----> 9 print(torch.mul(a, c).size())  # 由于a、b维度不同,报错
RuntimeError: The size of tensor a (4) must match the size of tensor b (5) at non-singleton dimension 1

2、torch.bmm()

参考:https://pytorch.org/docs/stable/torch.html#torch.bmm

torch.bmm(input, mat2, out=None) → Tensor
torch.bmm()是tensor中的一个相乘操作,类似于矩阵中的A*B。

参数:

input,mat2:两个要进行相乘的tensor结构,两者必须是3D维度的,每个维度中的大小是相同的。
output:输出结果

并且相乘的两个矩阵,要满足一定的维度要求:input(p,m,n) * mat2(p,n,a) ->output(p,m,a)。这个要求,可以类比于矩阵相乘。前一个矩阵的列等于后面矩阵的行才可以相乘。

举例

import torch
x = torch.rand(2,4,5)
y = torch.rand(2,5,7)
print(torch.bmm(x,y).size())

输出

torch.Size([2, 4, 7])

3、torch.matmul()

torch.matmul()也是一种类似于矩阵相乘操作的tensor联乘操作。但是它可以利用python 中的广播机制,处理一些维度不同的tensor结构进行相乘操作。这也是该函数与torch.bmm()区别所在。

参数:

input,other:两个要进行操作的tensor结构

output:结果

一些规则约定:

(1)若两个都是1D(向量)的,则返回两个向量的点积
(2)若两个都是2D(矩阵)的,则按照(矩阵相乘)规则返回2D
(3)若input维度1D,other维度2D,则先将1D的维度扩充到2D(1D的维数前面+1),然后得到结果后再将此维度去掉,得到的与input的维度相同。即使作扩充(广播)处理,input的维度也要和other维度做对应关系。

输入

import torch
x = torch.rand(5) #1D
x1 = x.view(1,-1)
y = torch.rand(5,3) #2D

print(x1.size())
print(x.size())
print(y.size())
print(torch.matmul(x,y),'\n',torch.matmul(x,y).size())
print(torch.matmul(x1,y),'\n',torch.matmul(x,y).size())

输出

torch.Size([1, 5])
torch.Size([5])
torch.Size([5, 3])
tensor([1.5374, 1.3291, 1.8289]) 
 torch.Size([3])
tensor([[1.5374, 1.3291, 1.8289]]) 
 torch.Size([3])
(4)若input是2D,other是1D,则返回两者的点积结果。(个人觉得这块也可以理解成给other添加了维度,然后再去掉此维度,只不过维度是(3, )而不是规则(3)中的( ,4)了,但是可能就是因为内部机制不同,所以官方说的是点积而不是维度的升高和下降)

举例

import torch
x = torch.rand(3) #1D
x1 = x.view(-1,1)
y = torch.rand(5,3) #2D

print(x1.size())
print(x.size())
print(y.size())
print(torch.matmul(y,x),'\n',torch.matmul(y,x).size())
print(torch.matmul(y,x1),'\n',torch.matmul(y,x1).size())

输出

torch.Size([3, 1])
torch.Size([3])
torch.Size([5, 3])
tensor([0.6472, 0.7025, 0.2358, 0.2873, 0.5696]) 
 torch.Size([5])
tensor([[0.6472],
        [0.7025],
        [0.2358],
        [0.2873],
        [0.5696]]) 
 torch.Size([5, 1])

(5)如果一个维度至少是1D,另外一个大于2D,则返回的是一个批矩阵乘法( a batched matrix multiply)

  • (a)若input是1D,other是大于2D的,则类似于规则(3)
  • (b)若other是1D,input是大于2D的,则类似于规则(4)
  • (c)若input和other都是3D的,则与torch.bmm()函数功能一样
  • (d)如果input中某一维度满足可以广播(扩充),那么也是可以进行相乘操作的。例如 input(j,1,n,m)* other (k,m,p) = output(j,k,n,p)

言而总之,总而言之:matmul()根据输入矩阵自动决定如何相乘。低维根据高维需求,合理广播。
参考文献:https://www.jianshu.com/p/e277f7fc67b3

PyTorch疑难杂症(1)——torch.matmul()函数用法总结 目录一、函数介绍二、常见用法2.1 两个一维向量的乘积运算2.2 两个二维矩阵的乘积运算2.3 一个一维向量和一个二维矩阵的乘积运算2.4 一个二维矩阵和一个一维向量的乘积运算2.5 其他 一、函数介绍 pytorch中两个张量的乘法可以分为两种: 两个张量对应元素相乘,在PyTorch中可以通过torch.mul函数(或*运算符)实现; 两个张量矩阵相乘,在PyTorch中可以通过torch.matmul函数实现; torch.matmul(input, other) → Tensor 计算两个张量i 阅读详情

相关推荐

【pytorch】torch.mm,torch.bmm以及torch.matmul的使用

torch.mm torch.mm是两个矩阵相乘,即两个二维的张量相乘 如下面的例子 mat1 = torch.randn(2,3) print("mat1=", mat1) mat2 = torch.randn(3,2) print("mat2=", mat2) mat3 = torch.mm(mat1, mat2) print("mat3=", mat3) 但是如果维度超过二维,则会报错。RuntimeError: self must be a matrix torch.bmm 它其实就是加了一

安安爸Chris的专栏 3万+

数组排序后复原

参考链接: pytorch技巧1: 数组排序后复原 Microsoft Windows [版本 10.0.18363.1256] (c) 2019 Microsoft Corporation。保留所有权利。 C:\Users\chenxuqi>conda activate ssd4pytorch1_2_0 (ssd4pytorch1_2_0) C:\Users\chenxuqi>python Python 3.7.7 (default, May 6 2020, 11:45:54) [MSC

敲代码的小风 788

【实战指南】PyTorch中矩阵运算的广播机制与高效实现(点乘与叉乘篇)

本文深入解析PyTorch中矩阵运算的点乘与叉乘操作,详细介绍广播机制及其高效实现方法。通过实战案例展示如何避免常见错误,优化计算性能,特别适合神经网络开发者提升矩阵运算效率。文章涵盖点乘的三种实现方式、叉乘的批量处理技巧,以及性能优化建议。

weixin_28235513的博客 191

torch.mul()函数使用说明,含高维张量实例及运行结果

对输入的张量或数做点积运算,如果维度不统一会想进行维度统一(广播机制),再进行点积运算;广播机制是直接复制上一维度的值。直接看一个5维的二值例子,先看图(红虚线和实线是为了便于区分维度而添加),不懂再结合代码和结果分析 代码如下: 运行结果为: 参考博文及感谢 部分内容参考以下链接,这里表示感谢 Thanks♪(・ω・)ノ 参考博文1 torch.mul() 官方文档 https://pytorch.org/docs/stable/generated/torch.mul.html

qq_39407949的博客 4199

pytorch函数mm() mul() matmul()区别

1、函数 1.1 作用 torch.matmul是tensor的乘法,输入可以是高维的。 2 、举例 当输入都是二维时,就是普通的矩阵乘法,和tensor.mm函数用法相同。 当输入有多维时,把多出的一维作为batch提出来,其他部分做矩阵乘法。 下面看一个两个都是3维的例子: 将b的第0维1broadcast成2提出来,后两维做矩阵乘法即可。 再看一个复杂一点的,是官网的例子: 首先把a的第0维2作为batch提出来,则a和b都可看作三维。再把a的1broadcat成5,提取公因式5。(这样

qq_35091353的博客 1万+

别再为GEE注册发愁了!用谷歌Cloud Project,5分钟搞定谷歌地球引擎账户(保姆级图文)

本文提供2024最新版谷歌地球引擎(GEE)账户注册的保姆级教程,通过谷歌Cloud Project快速完成注册,5分钟极速通关。详细解析注册前的准备、分步图解流程、常见误区及解决方案,帮助用户避开90%的注册陷阱,直达GEE核心功能区。

weixin_42557830的博客 201

torch.matmul()用法介绍

torch.mm()

杂文集 18万+

配置思科交换机冗余链路汇聚

本文对交换机端口汇聚配置进行说明

istrangeboy&begin zero的博客 6685

【Pytorch】进阶学习:实现矩阵乘法---torch.mul() 、 torch.mm() 和torch.matmul()的区别

🔥【PyTorch矩阵乘法揭秘】🔥 你是否曾对PyTorch中的矩阵乘法函数感到困惑?别担心,这篇博客为你揭晓torch.mul()、torch.mm()和torch.matmul()三大函数的奥秘!从元素级别的乘法到广义矩阵乘法,我们一一剖析,让你轻松掌握它们的区别与用法。无论你是深度学习新手还是进阶者,都能在这里找到答案。快来加入我们,一起探索PyTorch矩阵乘法的精彩世界吧!#PyTorch #矩阵乘法 #torch.mul #torch.mm #torch.matmul

创作高质量博文,分享知识,共同进步! 2895

【OWL部署】Manus又一开源平替OWL真的很好用吗?手把手带你部署并运行你的AI助手OWL(对接Qwen、硅基流动接口)

本文介绍了通用人工智能OWL的部署及国内接口对接,全篇干货满满,手把手教学。

MosuoLc的博客 4046

SRAM vs RRAM:存算一体芯片选型指南(含最新技术对比)

本文深入对比了SRAM与RRAM在存算一体芯片设计中的核心差异,为硬件工程师和架构师提供实战选型指南。文章从技术本质、性能、功耗、成本及设计风险等多维度剖析,指出SRAM基于成熟CMOS工艺,适合高精度、低延迟场景;而RRAM凭借非易失性和高密度潜力,在超低功耗、固定模型应用中优势明显。决策需综合项目预算、上市时间及技术储备。

e4f5g6h的博客 942

【pytorch】矩阵乘法 mm bmm matmul mul @ * 总结

1. 二维矩阵乘法 torch.mm() torch.mm(mat1, mat2, out=None) 其中mat1(nxm), mat2(mxd), 输出out(nxd) 一般只用来计算两个二维矩阵的矩阵乘法,而且不支持broadcast操作。 torch.mm(input, mat2, out=None) → Tensor #对矩阵imput和mat2执行矩阵乘法。 如果input为(n x m)张量,则mat2为(m x p)张量,out将为(n x p)张量。 #官方提示此功能不广播。有关广播的矩

Watson的博客 1306

S7-200 Smart 控制运动轴(脉冲电机/伺服)教程

S7-200 Smart 控制运动轴(脉冲电机/伺服) 结合本人刚接触触摸屏时候的踩坑经验,编写S7-200 Smart 控制运动轴(脉冲电机/伺服)的详细流程,给刚接触PLC的朋友提供一些经验指导。 本文详细介绍了S7-200 Smart 控制脉冲步进/伺服电机流程,包含接线方法及梯形图。希望对初学者有所帮助

xjbsw0的博客 5万+

PyToch 张量乘法之torch.mm(),torch.matmul(),torch.mul() ,torch.bmm() 的区别

torch.mm() torch.matmul() torch.mul() torch.bmm() 的区别 1.torch.mul() Hadamard product(哈达玛积)或者 element-wise product,按元素相乘,可以广播。 torch.mul(input,other,out=None) 该函数处理两种情况: input是矩阵/向量,other是标量这个时候是就是input的所有元素乘上other。 nput是矩阵/向量,other是矩阵/向量,这时候对位相乘,可以广播。

qq_39809262的博客 758

深入解析高通Adreno DPU的DRM/KMS驱动架构与硬件协同设计

本文深入解析了高通Adreno DPU的DRM/KMS驱动架构与硬件协同设计,详细介绍了Adreno DPU的核心模块组成、显示接口设计以及DRM驱动架构。通过实际案例和调试技巧,帮助开发者理解硬件与软件的协同工作原理,优化显示性能并解决常见问题。

weixin_29266679的博客 438

ADS 2013安装教程

1.2013和2014安装过程是一样的,运行ads2013_06_shp_windows文件进行安装 2.点击“NEXT”。 3.选择I accept,然后点击“NEXT”。 4.选择“complete”,然后点击“NEXT”。 5.选择安装路径,最好默认安装路径,安装路径不要有中文,然后点击“NEXT”。 6.点击“NEXT”. 7.如下路径默认安装,然后点击“NEXT”。 8.点击“NEXT”。 ...

谢谢关注“小鱼教你模数电”,各平台同号 6009

torch中的乘法符号(*),torch.mm()和torch.matmul(),torch.mul(), torch.bmm()

前言 torch中常见的一些矩阵乘法和元素乘积,说白了无非就是以下四种,为了避免忘了,做个笔记 乘法符号 * torch.mul() torch.mm torch.matmul 1. 对比 乘法符号* # shape=(2,5) node = tensor([[1, 1, 1, 0, 0], [1, 1, 1, 1, 1]]) node_0 = node.unsqueeze(-1) ''' tensor([[[1], [1], [1], [0]

xinjieyuan的博客 3704

电池模拟器【 电化学模型深度解析:PNGV模型原理与应用(专业科普版)】

1. 模型起源PNGV(Partnership for a New Generation of Vehicles)模型诞生于1993年美国“新一代汽车合作计划”,旨在提升混合动力汽车电池系统的建模精度。该模型最初针对铅酸电池设计,后经改进广泛用于锂离子电池、镍氢电池等动态特性仿真。2. 模型定位PNGV属于**等效电路模型(ECM)**的进阶版本,介于简单Rint模型与复杂电化学模型(如P2D模型)之间,兼顾计算效率与精度,是BMS(电池管理系统)中SOC/SOH估算的主流选择。PNGV模型凭借。

优快云-新能源汽车研发测试专业博主 1700

python 和 pytorch中的矩阵乘法

python和pytorch中的矩阵乘法

weixin_43102043的博客 781

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

PyTorch 19. PyTorch中相似操作的区别与联系

PyTorch 19. PyTorch中相似操作的区别与联系view() 和 reshape()总结expand()和repeat()expand()repeat()乘法操作二维矩阵乘法 torch.mm()三维带batch的矩阵乘法torch.bmm()多维矩阵乘法 torch.matmul() view() 和 reshape() 写在开头: 有一篇大佬的总结非常到位:博客 总结 view() 在操作tensor时,需要tensor是内存连续的,而且在进行尺寸变换时,view()操作不会新开辟内存空间

DCGJ666的博客 1178

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

李沐动手学AI——pytorch函数大全

内含pytorch常用函数大全,适用于深度学习入门

weixin_63339973的博客 267

pytorch之torch中的几种乘法 #点乘torch.mm() #矩阵乘torch.mul(),torch.matmul() #高维Tensor相乘维度要求

文章目录1. 点乘——`torch.mul(a, b)`2. 矩阵乘2.1. 二维矩阵乘——`torch.mm(a, b)`2.2. 高维矩阵乘——`torch.matmul(a, b)`3. 高维的Tensor相乘维度要求3.1. 对于维数相同的张量3.2. 对于维数不一样的张量 1. 点乘——torch.mul(a, b) 点乘都是broadcast的,可以用torch.mul(a, b)实现,也可以直接用*实现。 当a, b维度不一致时,会自动填充到相同维度相点乘。 import torch a =

夏普通 4万+

Pytorch基础:张量相关的乘法(torch.mul、torch.mv、torch.matmul、torch.mm、torch.bmm、torch.dot、torch.tensordot、*、@)

本文详细介绍了PyTorch中常见的张量乘法运算,包括torch.mul(逐元素乘法)、torch.matmul(矩阵乘法)、torch.mm(矩阵乘法)、torch.bmm(批量矩阵乘法)、torch.dot(向量点积)、torch.tensordot(张量点积)以及运算符*和@的用法。通过具体示例说明了各种乘法操作的特点,特别是广播机制在不同运算中的应用场景。文章还强调了不同运算对输入张量形状的要求差异,帮助读者理解PyTorch中张量乘法的多样性和适用场景。

保持终身学习的能力,温故而知新 2991

torch.mul、torch.mm、torch.bmm、torch.matmul的区别

torch.mul、torch.mm、torch.bmm、torch.matmul的区别

给时光以生命 1万+

torch中的几种乘法。torch.mm, torch.mul, torch.matmul

一、点乘 点乘都是broadcast的,可以用torch.mul(a, b)实现,也可以直接用*实现。 >>> a = torch.ones(3,4) >>> a tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> b = torc...

weixin_42105432的博客 2万+
上一篇: Python字典切片
下一篇: 《深度学习》之 循环神经网络 原理
irober
博客等级 码龄8年 1104粉丝 134原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

irober

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值