torch.mul()

函数功能:逐个对 inputother 中对应的元素相乘。

本操作支持广播,因此 inputother 均可以是张量或者数字。

举例如下:

>>> import torch
>>> a = torch.randn(3)
>>> a
tensor([-1.7095, 1.7837, 1.1865])
>>> b = 2
>>> torch.mul(a, b)
tensor([-3.4190, 3.5675, 2.3730]) # 这里将 other 扩展成了 input 的形状
>>> a = 3
>>> b = torch.randn(3, 1)
>>> b
tensor([[-0.7705],
[ 1.1177],
[ 1.2447]])
>>> torch.mul(a, b)
tensor([[-2.3116],
[ 3.3530],
[ 3.7341]]) # 这里将 input 扩展成了 other 的形状
>>> a = torch.tensor([[2], [3]])
>>> a
tensor([[2],
[3]]) # a 是 2×1 的张量
>>> b = torch.tensor([-1, 2, 1])
>>> b
tensor([-1, 2, 1]) # b 是 1×3 的张量
>>> torch.mul(a, b)
tensor([[-2, 4, 2],
[-3, 6, 3]])

这个例子中,inputoutput 的形状都不是公共形状,因此两个都需要广播,都变成 2×3 的形状,然后再逐个元素相乘。

$$

\begin{gather}

\begin{pmatrix}

2 \

3

\end{pmatrix}

\Rightarrow

\begin{pmatrix}

2 & 2 & 2 \

3 & 3 & 3

\end{pmatrix}

\ , \

\begin{pmatrix}

-1 & 2 & 1

\end{pmatrix}

\Rightarrow

\begin{pmatrix}

-1 & 2 & 1 \

-1 & 2 & 1

\end{pmatrix}

\

\

\begin{pmatrix}

2 & 2 & 2 \

3 & 3 & 3

\end{pmatrix}

×

\begin{pmatrix}

-1 & 2 & 1 \

-1 & 2 & 1

\end{pmatrix}

\begin{pmatrix}

-2 & 4 & 2 \

-3 & 6 & 3

\end{pmatrix}

\end{gather}

$$

由上述例子可以看出,这种乘法是逐个对应元素相乘,因此 inputoutput 的前后顺序并不影响结果,即 torch.mul(a, b) =torch.mul(b, a)

官方文档

torch.multiply()

torch.mul() 的别称。

torch.dot()

函数功能:计算 inputoutput 的点乘,此函数要求 inputoutput必须是一维的张量(其 shape 属性中只有一个值)!并且要求两者元素个数相同

举例如下:

>>> torch.dot(torch.tensor([2, 3]), torch.tensor([2, 1]))
tensor(7) >>> torch.dot(torch.tensor([2, 3]), torch.tensor([2, 1, 1])) # 要求两者元素个数相同
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: inconsistent tensor size, expected tensor [2] and src [3] to have the same number of elements, but got 2 and 3 elements respectively

官方文档

torch.mm()

函数功能:实现线性代数中的矩阵乘法(matrix multiplication):(n×m) × (m×p) = (n×p)

本函数不允许广播!

举例如下:

>>> mat1 = torch.randn(2, 3)
>>> mat2 = torch.randn(3, 2)
>>> torch.mm(mat1, mat2)
tensor([[-1.1846, -1.8327],
[ 0.8820, 0.0312]])

官方文档

torch.mv()

函数功能:实现矩阵和向量(matrix × vector)的乘法,要求 input 的形状为 n×moutputtorch.Size([m])的一维 tensor。

举例如下:

>>> mat = torch.tensor([[1, 2, 3], [4, 5, 6]])
>>> mat
tensor([[1, 2, 3],
[4, 5, 6]])
>>> vec = torch.tensor([-1, 1, 2])
>>> vec
tensor([-1, 1, 2])
>>> mat.shape
torch.Size([2, 3])
>>> vec.shape
torch.Size([3])
>>> torch.mv(mat, vec)
tensor([ 7, 13])

注意,此函数要求第二个参数是一维 tensor,也即其 ndim 属性值为 1。这里我们要区分清楚张量的 shape 属性和 ndim 属性,前者表示张量的形状,后者表示张量的维度。(线性代数中二维矩阵的维度 m×n 通常理解为这里的形状)

对于 shape 值为 torch.Size([n])torch.Size(1, n) 的张量,前者的 ndim=1 ,后者的 ndim=2 ,因此前者是可视为线代中的向量,后者可视为线代中的矩阵。

对于 shape 值为 torch.Size([1, n])torch.Size([n, 1]) 的张量,它们同样在 Pytorch 中被视为矩阵。例如:

>>> column = torch.tensor([[1], [2]])
>>> row = torch.tensor([3, 4])
>>> column.shape
torch.Size([2, 1]) # 矩阵
>>> row.shape
torch.Size([2]) # 一维张量
>>> matrix = torch.randn(1, 3)
>>> matrix.shape
torch.Size([1, 3]) # 矩阵

对于张量(以及线代中的向量和矩阵)的理解可看这篇博文

官方文档

torch.bmm()

函数功能:实现批量的矩阵乘法。

本函数要求 inputoutputndim 均为 3,且前者形状为 b×n×m,后者形状为 b×m×p 。可以理解为 input 中包含 b 个形状为 n×m 的矩阵, output 中包含 b 个形状为 m×p 的矩阵,然后第一个 n×m 的矩阵 × 第一个 m×p 的矩阵得到第一个 n×p 的矩阵,第二个……,第 b 个……因此最终得到 b 个形状为 n×p 的矩阵,即最终结果是一个三维张量,形状为 b×n×p

举例如下:

>>> batch_matrix_1 = torch.tensor([ [[1, 2], [3, 4], [5, 6]] , [[-1, -2], [-3, -4], [-5, -6]] ])
>>> batch_matrix_1
tensor([[[ 1, 2],
[ 3, 4],
[ 5, 6]], [[-1, -2],
[-3, -4],
[-5, -6]]])
>>> batch_matrix_1.shape
torch.Size([2, 3, 2]) >>> batch_matrix_2 = torch.tensor([ [[1, 2], [3, 4]], [[1, 2], [3, 4]] ])
>>> bat
batch_matrix_1 batch_matrix_2
>>> batch_matrix_2
tensor([[[1, 2],
[3, 4]], [[1, 2],
[3, 4]]])
>>> batch_matrix_2.shape
torch.Size([2, 2, 2]) >>> torch.bmm(batch_matrix_1, batch_matrix_2)
tensor([[[ 7, 10],
[ 15, 22],
[ 23, 34]], [[ -7, -10],
[-15, -22],
[-23, -34]]])

官方文档

torch.matmul()

官方文档

torch.matmul() 可以用于 PyTorch 中绝大多数的乘法,在不同的情形下,它与上述各个乘法函数起着相同的作用,具体请看这篇博文

PyTorch 中的乘法:mul()、multiply()、matmul()、mm()、mv()、dot()的更多相关文章

  1. PyTorch 中 torch.matmul() 函数的文档详解

    官方文档 torch.matmul() 函数几乎可以用于所有矩阵/向量相乘的情况,其乘法规则视参与乘法的两个张量的维度而定. 关于 PyTorch 中的其他乘法函数可以看这篇博文,有助于下面各种乘法的 ...

  2. numpy 和tensorflow 中的乘法

    矩阵乘法:tf.matmul()   np.dot() ,@ 逐元素乘法:tf.multiply()  np.multiply()

  3. Pytorch中的自编码(autoencoder)

    Pytorch中的自编码(autoencoder) 本文资料来源:https://www.bilibili.com/video/av15997678/?p=25 什么是自编码 先压缩原数据.提取出最有 ...

  4. [转载]Pytorch中nn.Linear module的理解

    [转载]Pytorch中nn.Linear module的理解 本文转载并援引全文纯粹是为了构建和分类自己的知识,方便自己未来的查找,没啥其他意思. 这个模块要实现的公式是:y=xAT+*b 来源:h ...

  5. PyTorch官方中文文档:PyTorch中文文档

    PyTorch中文文档 PyTorch是使用GPU和CPU优化的深度学习张量库. 说明 自动求导机制 CUDA语义 扩展PyTorch 多进程最佳实践 序列化语义 Package参考 torch to ...

  6. PyTorch中ReLU的inplace

    0 - inplace 在pytorch中,nn.ReLU(inplace=True)和nn.LeakyReLU(inplace=True)中存在inplace字段.该参数的inplace=True的 ...

  7. pytorch中tensorboardX的用法

    在代码中改好存储Log的路径 命令行中输入 tensorboard --logdir /home/huihua/NewDisk1/PycharmProjects/pytorch-deeplab-xce ...

  8. Pytorch中RoI pooling layer的几种实现

    Faster-RCNN论文中在RoI-Head网络中,将128个RoI区域对应的feature map进行截取,而后利用RoI pooling层输出7*7大小的feature map.在pytorch ...

  9. pytorch 中的重要模块化接口nn.Module

    torch.nn 是专门为神经网络设计的模块化接口,nn构建于autgrad之上,可以用来定义和运行神经网络 nn.Module 是nn中重要的类,包含网络各层的定义,以及forward方法 对于自己 ...

随机推荐

  1. 关于BIO NIO和AIO的理解

    转载自 :http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间 ...

  2. vue-cli创建的项目打包成app引入字体图标的问题

    将项目在手机端调试时,发现引入的阿里图标显示不出来,需要在引入的iconfont.css文件夹里给url加上https

  3. MIME类型说明(HTTP协议中数据类型)

    MIME(HTTP协议中数据类型) MIME:多功能Internet邮件扩充服务.MIME类型的格式是"大类型/小类型",并与某一种文件的扩展名相对应. 常见的MIME类型: RT ...

  4. Java流程控制03:顺序结构

    顺序结构 Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行. 顺序结构是最简单的算法结构.从上到下 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处 ...

  5. 张高兴的 .NET IoT 入门指南:(七)制作一个气象站

    距离上一篇<张高兴的 .NET Core IoT 入门指南>系列博客的发布已经过去 2 年的时间了,2 年的时间 .NET 版本发生了巨大的变化,.NET Core 也已不复存在,因此本系 ...

  6. Zookeeper应用场景汇总(超详细)

    Zookeeper典型应用场景汇总 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例 ...

  7. Request与Response

    前言 request和response对象是由服务器创建的.我们来使用它们: request对象是来获取请求消息,response对象是来设置响应消息. Request 定义 服务器进行创建,通过该对 ...

  8. linux中shell变量$#等的释义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: 1. $$ Shell本身的PID(ProcessID) 2. $! Shell最后运行的后台Process的PID 3 ...

  9. Callable接口及Futrue接口详解

    Callable接口 有两种创建线程的方法-一种是通过创建Thread类,另一种是通过使用Runnable创建线程.但是,Runnable缺少的一项功能是,当线程终止时(即run()完成时),我们无法 ...

  10. Java语言中的访问权限修饰符

    一个Java应用有很多类,但是有些类,并不希望被其他类使用.每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用.如何能做到访问控制呢?就需要使用访问权限修饰符. Java语 ...