详解torch.Tensor的4种乘法


Posted in Python onSeptember 03, 2020

torch.Tensor有4种常见的乘法:*, torch.mul, torch.mm, torch.matmul. 本文抛砖引玉,简单叙述一下这4种乘法的区别,具体使用还是要参照官方文档。

点乘

a与b做*乘法,原则是如果a与b的size不同,则以某种方式将a或b进行复制,使得复制后的a和b的size相同,然后再将a和b做element-wise的乘法

下面以*标量和*一维向量为例展示上述过程。

* 标量

Tensor与标量k做*乘法的结果是Tensor的每个元素乘以k(相当于把k复制成与lhs大小相同,元素全为k的Tensor).

>>> a = torch.ones(3,4)
>>> a
tensor([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])
>>> a * 2
tensor([[2., 2., 2., 2.],
    [2., 2., 2., 2.],
    [2., 2., 2., 2.]])

* 一维向量

Tensor与行向量做*乘法的结果是每列乘以行向量对应列的值(相当于把行向量的行复制,成为与lhs维度相同的Tensor). 注意此时要求Tensor的列数与行向量的列数相等。

>>> a = torch.ones(3,4)
>>> a
tensor([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])
>>> b = torch.Tensor([1,2,3,4])
>>> b
tensor([1., 2., 3., 4.])
>>> a * b
tensor([[1., 2., 3., 4.],
    [1., 2., 3., 4.],
    [1., 2., 3., 4.]])

Tensor与列向量做*乘法的结果是每行乘以列向量对应行的值(相当于把列向量的列复制,成为与lhs维度相同的Tensor). 注意此时要求Tensor的行数与列向量的行数相等。

>>> a = torch.ones(3,4)
>>> a
tensor([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])
>>> b = torch.Tensor([1,2,3]).reshape((3,1))
>>> b
tensor([[1.],
    [2.],
    [3.]])
>>> a * b
tensor([[1., 1., 1., 1.],
    [2., 2., 2., 2.],
    [3., 3., 3., 3.]])

* 矩阵

经Arsmart在评论区提醒,增补一个矩阵 * 矩阵的例子,感谢Arsmart的热心评论!
如果两个二维矩阵A与B做点积A * B,则要求A与B的维度完全相同,即A的行数=B的行数,A的列数=B的列数

>>> a = torch.tensor([[1, 2], [2, 3]])
>>> a * a
tensor([[1, 4],
    [4, 9]])

broadcast

点积是broadcast的。broadcast是torch的一个概念,简单理解就是在一定的规则下允许高维Tensor和低维Tensor之间的运算。broadcast的概念稍显复杂,在此不做展开,可以参考官方文档关于broadcast的介绍. 在torch.matmul里会有关于broadcast的应用的一个简单的例子。

这里举一个点积broadcast的例子。在例子中,a是二维Tensor,b是三维Tensor,但是a的维度与b的后两位相同,那么a和b仍然可以做点积,点积结果是一个和b维度一样的三维Tensor,运算规则是:若c = a * b, 则c[i,*,*] = a * b[i, *, *],即沿着b的第0维做二维Tensor点积,或者可以理解为运算前将a沿着b的第0维也进行了expand操作,即a = a.expand(b.size()); a * b

>>> a = torch.tensor([[1, 2], [2, 3]])
>>> b = torch.tensor([[[1,2],[2,3]],[[-1,-2],[-2,-3]]])
>>> a * b
tensor([[[ 1, 4],
     [ 4, 9]],

    [[-1, -4],
     [-4, -9]]])
>>> b * a
tensor([[[ 1, 4],
     [ 4, 9]],

    [[-1, -4],
     [-4, -9]]])

其实,上面提到的二维Tensor点积标量、二维Tensor点积行向量,都是发生在高维向量和低维向量之间的,也可以看作是broadcast.

torch.mul

官方文档关于torch.mul的介绍. 用法与*乘法相同,也是element-wise的乘法,也是支持broadcast的。

下面是几个torch.mul的例子.

乘标量

>>> a = torch.ones(3,4)
>>> a
tensor([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])
>>> a * 2
tensor([[2., 2., 2., 2.],
    [2., 2., 2., 2.],
    [2., 2., 2., 2.]])

乘行向量

>>> a = torch.ones(3,4)
>>> a
tensor([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])
>>> b = torch.Tensor([1,2,3,4])
>>> b
tensor([1., 2., 3., 4.])
>>> torch.mul(a, b)
tensor([[1., 2., 3., 4.],
    [1., 2., 3., 4.],
    [1., 2., 3., 4.]])

乘列向量

>>> a = torch.ones(3,4)
>>> a
tensor([[1., 1., 1., 1.],
    [1., 1., 1., 1.],
    [1., 1., 1., 1.]])
>>> b = torch.Tensor([1,2,3]).reshape((3,1))
>>> b
tensor([[1.],
    [2.],
    [3.]])
>>> torch.mul(a, b)
tensor([[1., 1., 1., 1.],
    [2., 2., 2., 2.],
    [3., 3., 3., 3.]])

乘矩阵

例1:二维矩阵 mul 二维矩阵

>>> a = torch.tensor([[1, 2], [2, 3]])
>>> torch.mul(a,a)
tensor([[1, 4],
    [4, 9]])

例2:二维矩阵 mul 三维矩阵(broadcast)

>>> a = torch.tensor([[1, 2], [2, 3]])
>>> b = torch.tensor([[[1,2],[2,3]],[[-1,-2],[-2,-3]]])
>>> torch.mul(a,b)
tensor([[[ 1, 4],
     [ 4, 9]],

    [[-1, -4],
     [-4, -9]]])

torch.mm

官方文档关于torch.mm的介绍. 数学里的矩阵乘法,要求两个Tensor的维度满足矩阵乘法的要求.

例子:

>>> a = torch.ones(3,4)
>>> b = torch.ones(4,2)
>>> torch.mm(a, b)
tensor([[4., 4.],
    [4., 4.],
    [4., 4.]])

torch.matmul

官方文档关于torch.matmul的介绍. torch.mm的broadcast版本.

例子:

>>> a = torch.ones(3,4)
>>> b = torch.ones(5,4,2)
>>> torch.matmul(a, b)
tensor([[[4., 4.],
     [4., 4.],
     [4., 4.]],

    [[4., 4.],
     [4., 4.],
     [4., 4.]],

    [[4., 4.],
     [4., 4.],
     [4., 4.]],

    [[4., 4.],
     [4., 4.],
     [4., 4.]],

    [[4., 4.],
     [4., 4.],
     [4., 4.]]])

同样的a和b,使用torch.mm相乘会报错

>>> torch.mm(a, b)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
RuntimeError: matrices expected, got 2D, 3D tensors at /pytorch/aten/src/TH/generic/THTensorMath.cpp:2065

到此这篇关于详解torch.Tensor的4种乘法的文章就介绍到这了,更多相关torch.Tensor 乘法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
Python下载网络小说实例代码
Feb 03 Python
python安装scipy的方法步骤
Jun 26 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
如何利用python 读取配置文件
Jan 06 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
python开发制作好看的时钟效果
May 02 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 #Python
python开发入门——列表生成式
Sep 03 #Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 #Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 #Python
Python开发入门——迭代的基本使用
Sep 03 #Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 #Python
Python多分支if语句的使用
Sep 03 #Python
You might like
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
刷新时清空文本框内容的js代码
2007/04/23 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
详解Python核心对象类型字符串
2018/02/11 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
Python字典dict常用方法函数实例
2020/11/09 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
优秀的茶餐厅创业计划书
2014/01/03 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
授权委托书样本
2014/04/03 职场文书
调研汇报材料范文
2014/08/17 职场文书
高中生毕业评语
2014/12/30 职场文书
八年级英语教学反思
2016/02/15 职场文书
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA