Pytorch阅读文档之dot,mm,matmul函数

Pytorch阅读文档之dot,mm,matmul函数

torch.dot()

torch.dot(input, tensor) → Tensor
#计算两个张量的点积(内积)
#官方提示:不能进行广播(broadcast).
#example
>>> torch.dot(torch.tensor([2, 3]), torch.tensor([2, 1])) #即对应位置相乘再相加
tensor(7)
>>> torch.dot(torch.rand(2, 3), torch.rand(2, 2))
#报错,只允许一维的tensor
RuntimeError: 1D tensors expected, got 2D, 2D tensors at /Users/distiller/project/conda/conda-bld/pytorch_1570710797334/work/aten/src/TH/generic/THTensorEvenMoreMath.cpp:774

torch.mm

torch.mm(input, mat2, out=None) → Tensor
#对矩阵imput和mat2执行矩阵乘法。 如果input为(n x m)张量,则mat2为(m x p)张量,out将为(n x p)张量。
#官方提示此功能不广播。有关广播的矩阵乘法,请参见torch.matmul()。
#example
>>> mat1 = torch.randn(2, 3)
>>> mat2 = torch.randn(3, 3)
>>> torch.mm(mat1, mat2)
tensor([[ 0.4851,  0.5037, -0.3633],
        [-0.0760, -3.6705,  2.4784]])

torch.matmul()

torch.matmul(input, other, out=None) → Tensor
#两个张量的矩阵乘积。行为取决于张量的维数,如下所示:
#1. 如果两个张量都是一维的,则返回点积(标量)。
>>> # vector x vector
>>> tensor1 = torch.randn(3)
>>> tensor2 = torch.randn(3)
>>> torch.matmul(tensor1, tensor2).size()
torch.Size([])
#2. 如果两个参数都是二维的,则返回矩阵矩阵乘积。
# matrix x matrix
>>> tensor1 = torch.randn(3, 4)
>>> tensor2 = torch.randn(4, 5)
>>> torch.matmul(tensor1, tensor2).size()
torch.Size([3, 5])
#3. 如果第一个参数是一维的,而第二个参数是二维的,则为了矩阵乘法,会将1附加到其维数上。矩阵相乘后,将删除前置尺寸。
# 也就是让tensor2变成矩阵表示,1x3的矩阵和 3x4的矩阵,得到1x4的矩阵,然后删除1
>>> tensor1 = torch.randn(3, 4)
>>> tensor2 = torch.randn(3)
>>> torch.matmul(tensor2, tensor1).size()
torch.Size([4])
#4. 如果第一个参数为二维,第二个参数为一维,则返回矩阵向量乘积。
# matrix x vector
>>> tensor1 = torch.randn(3, 4)
>>> tensor2 = torch.randn(4)
>>> torch.matmul(tensor1, tensor2).size()
torch.Size([3])
#5. 如果两个自变量至少为一维且至少一个自变量为N维(其中N> 2),则返回批处理矩阵乘法。如果第一个参数是一维的,则在其维数之前添加一个1,以实现批量矩阵乘法并在其后删除。如果第二个参数为一维,则将1附加到其维上,以实现成批矩阵倍数的目的,然后将其删除。非矩阵(即批量)维度可以被广播(因此必须是可广播的)。例如,如果input为(jx1xnxm)张量,而other为(k×m×p)张量,out将是(j×k×n×p)张量。
>>> # batched matrix x broadcasted vector
>>> tensor1 = torch.randn(10, 3, 4)
>>> tensor2 = torch.randn(4)
>>> torch.matmul(tensor1, tensor2).size()
torch.Size([10, 3])
>>> # batched matrix x batched matrix
>>> tensor1 = torch.randn(10, 3, 4)
>>> tensor2 = torch.randn(10, 4, 5)
>>> torch.matmul(tensor1, tensor2).size()
torch.Size([10, 3, 5])
>>> # batched matrix x broadcasted matrix
>>> tensor1 = torch.randn(10, 3, 4)
>>> tensor2 = torch.randn(4, 5)
>>> torch.matmul(tensor1, tensor2).size()
torch.Size([10, 3, 5])
>>> tensor1 = torch.randn(10, 1, 3, 4)
>>> tensor2 = torch.randn(2, 4, 5)
>>> torch.matmul(tensor1, tensor2).size()
torch.Size([10, 2, 3, 5])
### 三维张量的 `matmul` 矩阵乘法实现 在处理三维张量时,矩阵乘法可以通过多种方式实现,具体取决于所使用的库以及其内部机制。以下是针对 TensorFlow 和 NumPy 的实现方法。 #### 使用 TensorFlow 实现三维张量矩阵乘法 TensorFlow 提供了 `tf.matmul` 函数用于执行矩阵乘法操作。对于三维张量而言,`tf.matmul` 将会沿着最后一个维度进行计算,并假设输入数据遵循批量矩阵乘法规则[^1]。如果给定两个形状分别为 `[batch_size, m, k]` 和 `[batch_size, k, n]` 的张量,则结果将是形状为 `[batch_size, m, n]` 的新张量。 ```python import tensorflow as tf a = tf.constant([[[1., 2.], [3., 4.]], [[5., 6.], [7., 8.]]]) # Shape (2, 2, 2) b = tf.constant([[[9., 10.], [11., 12.]], [[13., 14.], [15., 16.]]]) # Shape (2, 2, 2) result = tf.matmul(a, b) # Result shape will be (2, 2, 2) print(result.numpy()) ``` 上述代码展示了如何利用 `tf.matmul` 对三维张量实施逐批次矩阵乘法。 #### 使用 NumPy 实现三维张量矩阵乘法 NumPy 中可以借助 `.dot()` 或者更通用的 `np.matmul()` 来完成类似的运算。当应用于三维数组时,这些函数同样支持按批处理的方式执行矩阵乘法[^2]。假设有两组三维数组 A (`shape=(p,q,r)`) 及 B (`shape=(p,r,s)`), 那么最终得到的结果 C 应该具有 `(p,q,s)` 这样的尺寸规格: ```python import numpy as np A = np.random.rand(2, 3, 4) # Example tensor of size (2, 3, 4) B = np.random.rand(2, 4, 5) # Example tensor of size (2, 4, 5) C = np.matmul(A, B) # Output tensor with dimensions (2, 3, 5) print(C.shape) # Should output: (2, 3, 5) ``` 这里需要注意的是,在 NumPy 下应用 `np.dot()` 方法可能会依据上下文环境自动调整行为模式;而相比之下,`np.matmul()` 则更加严格地按照定义来进行操作。 #### PyTorch 中的三维张量矩阵乘法 类似于其他框架,PyTorch 的 `torch.matmul` 能够高效地处理包含多个二维平面组成的高阶结构体之间的相互作用关系。它通过迭代访问每一个子层面上的小型标准矩形区域来达成目标效果[^3]。 ```python import torch X = torch.randn((2, 3, 4)) # Tensor X has dimensionality (2, 3, 4). Y = torch.randn((2, 4, 5)) # Tensor Y has dimensionality (2, 4, 5). Z = torch.matmul(X, Y) # Z's resulting form would then become (2, 3, 5). print(Z.size()) # Expected outcome is 'torch.Size([2, 3, 5])'. ``` 以上实例说明了即使是在更高层次上的抽象表达形式下依旧能够保持清晰易懂的操作逻辑. ### 总结 无论是采用 TensorFlow、NumPy 还是 PyTorch,它们各自的 `matmul` 功能都可以很好地适用于三维甚至更多维数的数据集上开展相应的线性代数变换过程。不过值得注意的地方在于不同工具之间可能存在细微差异之处,因此建议开发者们仔细查阅官方文档以便更好地理解并运用各自特性特点[^1].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值