PyTorch 对应点相乘、矩阵相乘

一,对应点相乘,x.mul(y) ,即点乘操作,点乘不求和操作,又可以叫作Hadamard product;点乘再求和,即为卷积

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

>>> a * a
tensor([[ 1.,  4.],
        [ 9., 16.],
        [25., 36.]])

二,矩阵相乘,x.mm(y)或者x.matmul(b), 矩阵大小需满足: (i, n)x(n, j)

>>> a
tensor([[1., 2.],
        [3., 4.],
        [5., 6.]])
>>> b = a.t()  # 转置
>>> b
tensor([[1., 3., 5.],
        [2., 4., 6.]])

>>> a.mm(b)
tensor([[ 5., 11., 17.],
        [11., 25., 39.],
        [17., 39., 61.]])

>>> a.matmul(b)
tensor([[ 5., 11., 17.],
        [11., 25., 39.],
        [17., 39., 61.]])

三、多维矩阵相乘

3维矩阵相乘

>>> a = torch.randn(64, 128, 56)
>>> b = torch.randn(64, 56, 72)

>>> a.shape
torch.Size([64, 128, 56])
>>> b.shape
torch.Size([64, 56, 72])

>>> d = a.matmul(b)  # 多出的一维作为batch提出来,其他部分做矩阵乘法。

>>> d.shape
torch.Size([64, 128, 72])  

# a.mm(b) 这个不行会报错:untimeError: self must be a matrix

4维矩阵相乘

>>> a = torch.randn(64, 3, 128, 56)
>>> b = torch.randn(64, 3, 56, 72)

>>> d = a.matmul(b)  # 多出的维数作为batch提出来,其他部分做矩阵乘法。

>>> d.shape
torch.Size([64, 3, 128, 72])  

# a.mm(b) 这个不行会报错:untimeError: self must be a matrix

### PyTorch 中张量相乘与广播机制 #### 张量相乘方式 在 PyTorch 中,存在多种方式进行张量之间的乘法操作。对于逐元素乘法而言,可以使用 `*` 或者 `torch.mul()` 函数来实现两个相同大小的张量之间对应位置上的数值相乘[^1]。 当涉及到矩阵乘法时,则有专门设计用来处理二维及以上维度数据的操作符: - 对于简单的二维矩阵乘法,推荐使用 `torch.mm()` 方法; - 而针对更高维的数据或是需要支持批处理的情况,应该采用更为通用灵活的 `torch.matmul()` 接口[^2]。 ```python import torch # 创建示例张量 tensor_a = torch.tensor([[1., 2.], [3., 4.]]) tensor_b = torch.tensor([[5., 6.], [7., 8.]]) # 使用 * 进行逐元素乘法 element_wise_product = tensor_a * tensor_b # 使用 matmul 执行矩阵乘法 matrix_multiplication_result = torch.matmul(tensor_a, tensor_b) print("Element-wise product:\n", element_wise_product) print("\nMatrix multiplication result:\n", matrix_multiplication_result) ``` #### 广播机制详解 为了使不同形状但兼容性的张量可以直接参与算术运算而不必显式调整其尺寸,在 PyTorch 内部实现了所谓的“广播”逻辑。这一特性允许较小规模或特定模式下的张量自动扩展至匹配较大张量的尺度以便完成相应计算过程[^3]。 具体来说,如果两个张量要通过广播来进行运算,那么它们各自最右边的一组轴(即最后一个维度)必须满足以下条件之一: - 尺寸完全一样; - 其中一方在此处只有一个单位长度(也就是等于1),此时该方向上会被视为重复填充直到与其他方保持一致[^4]。 这种灵活性不仅限于基本的四则运算之中,同样适用于其他类型的二元操作如比较、按位逻辑等场景下。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值