pytorch中提供了多种函数用于乘法操作,不同函数,功能有什么不一样呢?

torch.mul

multiply是mul的别名,与mul用法一致

torch.mul(input, other, *, out=None)

主要由两种用法:

(1)一个数和tensor中的每个元素对应相乘

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = torch.mul(a, 2)
print(b)
tensor([[ 2.,  4.],[ 6.,  8.],[10., 12.]])

(2)tensor与tensor中的每个元素相乘

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
c = torch.mul(a, a)
print(c)
tensor([[ 1.,  4.],[ 9., 16.],[25., 36.]])

令我疑惑的是,官方代码中给出了下图的一个例子,自己运行了确实得到相同的结果。但是如果将两个维度改成4*2和2*4,代码报错。不知道为什么会这么设计?

torch.mm

torch.mm(input, mat2, *, out=None)

实现了矩阵相乘(只能处理二维tensor)

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = a.t()
c = torch.mm(a, b)
print(c)
tensor([[ 5., 11., 17.],[11., 25., 39.],[17., 39., 61.]])

torch.bmm

torch.bmm(input, mat2, *, deterministic=False, out=None)

实现了三维tensor的相乘,并且两个tensor的第一个维度要一致,在神经网络里面一般对应这batch这一维度。即按照第一个维度切分成多个矩阵,然后再进行矩阵相乘。

a = torch.randn(10, 3, 4)
b = torch.randn(10, 4, 5)
c = torch.bmm(a, b).size()
print(c)
torch.Size([10, 3, 5])

torch.matmul

torch.matmul(input, other, *, out=None)

根据输入维度的不同,torch.matmul实现了多种乘法

(1)输入两个向量,两个向量同维度,则计算这两个向量的‘内积

a = torch.tensor([1, 2, 3])
b = torch.tensor([1, 2, 3])
c = torch.matmul(a, b)
print(c)
tensor(14)

(2)输入一个矩阵和一个向量,向量的维度等于矩阵维度的其中一维,隐式的将向量的第二个维度扩展为1,然后进行矩阵乘法操作,并还原维度

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = torch.Tensor([1, 2])
c = torch.matmul(a, b)
# (3*2)x(2*1)
print(c)
tensor([ 5., 11., 17.])

(3)输入的为两个矩阵,并且可以进行乘法操作,则进行矩阵相乘,与此处torch.mm功能一致

a = torch.Tensor([[1, 2], [3, 4], [5, 6]])
b = a.t()
c = torch.matmul(a, b)
print(c)
tensor([[ 5., 11., 17.],[11., 25., 39.],[17., 39., 61.]])

(4)输入一个是三维tensor,一个是向量。隐式的将向量扩展成三维,第一维与另一个tensor相同,第二维是原来向量的维度,第三维为1,然后进行tensor的相乘操作,并还原维度

a = torch.randn(10, 3, 4)
b = torch.randn(4)
c = torch.matmul(a, b).size()
# (10*3*4)*(10*4*1)
print(c)
torch.Size([10, 3])

(5)输入一个三维tensor和一个矩阵,矩阵进行复制扩展,进行tensor相乘操作,并还原维度

a = torch.randn(10, 3, 4)
b = torch.randn(4, 5)
c = torch.matmul(a, b).size()
# (10*3*4)*(10*4*5)
print(c)
torch.Size([10, 3, 5])

(6)输入是两个三维tensor,进行tensor相乘操作,这里与torch.bmm的功能一致

a = torch.randn(10, 3, 4)
b = torch.randn(10, 4, 5)
c = torch.matmul(a, b).size()
print(c)
torch.Size([10, 3, 5])

torch.matmul会对输入进行必要维度的扩展(broadcast)

pytorch中的乘法操作相关推荐

  1. 极智AI | Pytorch 中常用乘法的 TensorRT 实现

      欢迎关注我的公众号 [极智视界],获取我的更多笔记分享   大家好,我是极智视界,本文介绍一下 Pytorch 中常用乘法的 TensorRT 实现.   pytorch 用于训练,TensorR ...

  2. pytorch中的卷积操作详解

    首先说下pytorch中的Tensor通道排列顺序是:[batch, channel, height, width] 我们常用的卷积(Conv2d)在pytorch中对应的函数是: torch.nn. ...

  3. opencv和pytorch中的warp操作函数:cv2.warpAffine, torch.nn.functional.grid_sample, cv2.warpPerspective

    关于图像的warp操作是指利用一个旋转缩放矩阵对图像进行操作. 常见的操作有,平移,绕某个点旋转,缩放. opencv中有getRotationMatrix2D,warpAffine, getAffi ...

  4. PyTorch中的padding操作

    1. 介绍 我们知道,在对图像执行卷积操作时,如果不对图像边缘进行填充,卷积核将无法到达图像边缘的像素,而且卷积前后图像的尺寸也会发生变化,这会造成许多麻烦. 因此现在各大深度学习框架的卷积层实现上基 ...

  5. python中tolist_高效的张量操作 Pytorch中就占5种

    PyTorch是一个基于Python的科学包,用于使用一种称为张量的特殊数据类型执行高级操作. 虽然也有其他方式可以实现相同的效果,但今天分享的这5个操作更加方便高效,值得一试. 什么是张量? 张量是 ...

  6. pytorch中自加(+=)与普通加的区别,及原位操作

    1 导论 本文阅读时长约为3分钟. 在今年的三大顶会中,利用pytorch做研究的论文已经一枝独秀,这归功于它的易操作性.当然,pytorch中也有一些需要注意的点,如自加和普通加,在一般的语言中两者 ...

  7. 【小白学习PyTorch教程】十七、 PyTorch 中 数据集torchvision和torchtext

    @Author:Runsen 对于PyTorch加载和处理不同类型数据,官方提供了torchvision和torchtext. 之前使用 torchDataLoader类直接加载图像并将其转换为张量. ...

  8. torch中的inplace操作问题解决方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 torch中的inplace操作问题解决方法 一.inplace操作是什么? 典型的inplace操作有哪些? 二.出错案例 总结 例 ...

  9. PyTorch中池化层的padding和ceil_mode参数设置

    在池化操作的接口中,padding和ceil_mode这两个参数会影响到输出特征图的大小.padding即对特征图大小进行扩充的像素数量:ceil_mode指明,当剩余的像素不足滤波器大小,是否仍对这 ...

最新文章

  1. 77底盒和86底盒的区别_86型开关底盒的具体参数
  2. 超越halcon速度的二值图像的腐蚀和膨胀,实现目前最快的半径相关类算法(附核心源码)。...
  3. 计算机组成原理 — CPU — 指令集架构类型
  4. android 滚动动画效果代码,Android Scroll滑动效果实例
  5. Java黑皮书课后题第9章:9.2(Stock类)遵照9.2节中Cirlce类的例子,设计一个名为Stock的类
  6. LINUX下配置bashrc文件/ PATH环境变量修改/别名/提示符
  7. asterisk使用MYSQL认证的配置方法
  8. 循环删除List集合的错误
  9. (四)Go 语言编译流程简述
  10. 20135310陈巧然家庭作业汇总[3.56 3.67 6.23 6.39.6.40 6.41]
  11. “深度学习”是人工智能的一场革命吗?
  12. 解决Maven报错“Cannot resolve com.lowagie:itext:2.1.7.js7”
  13. cboard企业版源码_CBoard的部署与使用
  14. matlab电压闪变测量,基于IEC的电压闪变测量模块设计
  15. Ubuntu安装Spark
  16. java自动化键盘组合键_SELENIUM自动化模拟键盘快捷键操作实现解析
  17. 华硕服务器系统安装系统安装教程视频,华硕的系统安装教程 华硕u盘安装系统教程...
  18. helm和operator
  19. (以三星S8为例)安卓全面屏手势设置教程
  20. 龙迅LT7911D Type-C/DP/eDP to MIPI DSI/CSI/LVDS 信号转换芯片

热门文章

  1. 在线电子商务网站 分页 的封装
  2. 如何在您的笔记本上搭建View 演示环境 -7.无线配置与连接
  3. python如何编程日期_python编程开发之日期操作实例分析
  4. 为什么手机网速太慢_为什么不同的5G手机网速差别高达47%!
  5. 服务器503能自动恢复吗,服务器出现503错误的原因与解决方法
  6. extjs 月份选择控件_Ext JS 4实现带week(星期)的日期选择控件(实战二)
  7. java面试会问到的问题吗_[转载]java面试中经常会被问到的一些算法的问题
  8. Ant design pro引入Echarts报错:TypeError: Cannot read property 'x_data' of undefined
  9. 运用工具Postman快速导出python接口测试脚本
  10. 《Docker技术从入门到实践》第1,2章