网络编程
位置:首页>> 网络编程>> 网络编程>> 详解torch.Tensor的4种乘法

详解torch.Tensor的4种乘法

作者:da_kao_la  发布时间:2023-08-11 21:09:03 

标签:torch.Tensor,乘法

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

来源:https://blog.csdn.net/da_kao_la/article/details/87484403

0
投稿

猜你喜欢

  • 如何用ASP输出HTML文件?<!--#include file="top.inc"--><
  • 网页上的图片如果设置了alt属性,当鼠标移经时就会有tooltip出现,但是只能显示一行文本,有时需要多行文本,乃至图片来显示图片、链接或者
  • 文章主要讲术了一些SQL Server新的Bug,帮您认识这些被忽略的SQL Server注入技巧。1.关于Openrowset和Opend
  • 设计是一个输入-输出的过程,因为首先有用户的需求,客户的项目才有设计的产生,设计是带有目的性和市场行为的,当然也有一部分的创造性设计,仅仅为
  • 你一定很熟悉Youtube了,知道它是一个视频分享网站。是的,youtube目前十分流行,你也许会常常访问。这里有一些关于youtube u
  • ajax编程获取Google的PageRank3(PR值)及所在目录,想给你的站增加Google PR查询的功能吗?如果你不会就看看本文吧,
  • 这是一个给新手学习代码的帖子,包含以下内容:如何使用UBB代码,如何用js与剪贴板交互,如何使用textRange对象,如何使用自定义的快捷
  • 模式库在模式库里,我将列出所有电子商务网站需要的模式.以下将罗列出经典常用的模式案例,我也试图让这些模式看起来更有趣味性与实用性。(Yaho
  • 1. 什么是XSLT 大家可能听说过XSL(eXtensible Stylesheet Language),XSL和我们这里说的XSLT从狭
  • python中eval函数的用法十分的灵活,这里主要介绍一下它的原理和一些使用的场合。下面是从python的官方文档中的解释: &
  • 有时,希望除去某些记录或更改它们的内容。DELETE 和 UPDATE 语句令我们能做到这一点。用update修改记录UPDATE tbl_
  • 带农历的JavaScript日期时间,增加了农历使这款代码更具实用性,很不错,不但有农历,而且还可以显示民国计年,可以判断显示闰月、闰年等,
  • 一、软件包a) freetds-stable.gzb) php-5.2.12.tar.gz二、安装步骤a) tar zxvf freetds
  • 由于某些原因需要把函数直接放到 img 标签上的 onload 属性执行,比如:For some reasons we have to ex
  •   [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋
  • 版权所有:Copyright 1997 Netscape Communications Corporation原文链接:Object Hie
  • 定义流的作用是使用统一的方式处理文件、网络和数据压缩等共用同一套函数和用法的操作。简单而言,流是具有流式行为的资源对象。因此,流可以线性读写
  • 好记星不如烂笔头,适时的总结梳理知识让人更轻松愉快。今天总结下学习和开发中遇到的JavaScript执行顺序的问题,今天挖个坑,以后会慢慢填
  • EF Core 是一个ORM(对象关系映射),它使 .NET 开发人员可以使用 .NET对象操作数据库,避免了像ADO.NET访问数据库的代
  • 代码如下:ADODB.Connection 错误 '800a0e7a' 未找到提供程序。该程序可能未正确安装。 /连接“网站
手机版 网络编程 asp之家 www.aspxhome.com