廊坊网站建设推广服务,做网站推广代理,wordpress增强搜索,做了半个月跨境电商不想干了matmul 的理解与使用 引言#xff1a;本实例以paddle框架中的matmul为例进行说明。torch和numpy中的matmul同理。 简介
PaddlePaddle中的matmul是一个矩阵乘法函数#xff0c;可以用来实现两个矩阵的乘法操作。在PaddlePaddle的动态图模式下#xff0c;可以用paddle.matmul…matmul 的理解与使用 引言本实例以paddle框架中的matmul为例进行说明。torch和numpy中的matmul同理。 简介
PaddlePaddle中的matmul是一个矩阵乘法函数可以用来实现两个矩阵的乘法操作。在PaddlePaddle的动态图模式下可以用paddle.matmul()函数来调用该函数其语法如下
# 源码链接https://github.com/PaddlePaddle/Paddle/blob/release/2.5/python/paddle/tensor/linalg.py#L139
paddle.matmul(x, y, transpose_xFalse, transpose_yFalse, nameNone)参数 x (Tensor) - 输入变量类型为 Tensor数据类型为 bfloat16 float16 float32 float64。 y (Tensor) - 输入变量类型为 Tensor数据类型为 bfloat16 float16 float32 float64。 transpose_x (bool可选) - 相乘前是否转置 x默认值为 False。 transpose_y (bool可选) - 相乘前是否转置 y默认值为 False。 name (str可选) - 具体用法请参见 Name一般无需设置默认值为 None。
返回
Tensor矩阵相乘后的结果数据类型和输入数据类型一致。
说明
目前输入 Tensor 的维数可以是任意数量matmul 可以用于 实现 dot matmul 和 batchmatmul。实际行为取决于输入 x 、输入 y 、 transpose_x transpose_y。具体如下
如果 transpose 为真则对应 Tensor 的后两维会转置。如果 Tensor 的一维则转置无效。假定 x 是一个 shape[D] 的一维 Tensor则 x 视为 [1, D]。然而y 是一个 shape[D]的一维 Tensor则视为[D, 1]。
乘法行为取决于 x 和 y 的尺寸。具体如下 如果两个 Tensor 均为一维则获得点积结果。 如果两个 Tensor 都是二维的则获得矩阵与矩阵的乘积。 如果 x 是 1 维的而 y 是 2 维的则将 1 放在 x 维度之前以进行矩阵乘法。矩阵相乘后将删除前置尺寸。 如果 x 是 2 维的而 y 是 1 维的获得矩阵与向量的乘积。 如果两个输入至少为一维且至少一个输入为 N 维其中 N 2则将获得批矩阵乘法。如果第一个自变量是一维的则将 1 放在其维度的前面以便进行批量矩阵的乘法运算然后将其删除。如果第二个参数为一维则将 1 附加到其维度后面以实现成批矩阵倍数的目的然后将其删除。根据广播规则广播非矩阵维度不包括最后两个维度。例如如果输入 x 是j1nmTensor另一个 y 是kmpTensor则 out 将是jknpTensor。
实例
下面对不同维度举例演示如何使用PaddlePaddle中的matmul函数计算两个矩阵的乘积
[3,2] matmul [2,2] - [3,2]
import paddle# 定义两个输入矩阵
x paddle.to_tensor([[1, 2], [3, 4], [5, 6]], dtypefloat32)
y paddle.to_tensor([[2, 1], [4, 3]], dtypefloat32)# 计算矩阵乘积
z paddle.matmul(x, y)# 打印结果
print(fx: \n{x.numpy()}, shape: {x.shape})
print(fy: \n{y.numpy()}, shape: {y.shape})
print(fz: \n{z.numpy()}, shape: {z.shape})输出结果为
x:
[[1. 2.][3. 4.][5. 6.]], shape: [3, 2]
y:
[[2. 1.][4. 3.]], shape: [2, 2]
z:
[[10. 7.][22. 15.][34. 23.]], shape: [3, 2]在这个例子中我们首先定义了两个输入矩阵x和y然后调用paddle.matmul()函数计算它们的乘积并将结果保存到变量z中。最后我们打印出x,y,z的值和形状方便观察结果。
[2] matmul [2, 3] - [3]
import paddle# 定义两个输入矩阵
# x paddle.to_tensor([[1, 2], [3, 4], [5, 6]], dtypefloat32)
# x paddle.to_tensor([[1, 2], [3, 4]], dtypefloat32)
x paddle.to_tensor([[1, 2, 3], [4, 5, 6]], dtypefloat32)# y paddle.to_tensor([[2, 1], [4, 3]], dtypefloat32)
y paddle.to_tensor([2, 1], dtypefloat32)# 计算矩阵乘积
# z paddle.matmul(x, y)
z paddle.matmul(y, x)# 打印结果
print(fx: \n{x.numpy()}, shape: {x.shape})
print(fy: \n{y.numpy()}, shape: {y.shape})
print(fz: \n{z.numpy()}, shape: {z.shape})
输出结果为
x:
[[1. 2. 3.][4. 5. 6.]], shape: [2, 3]
y:
[2. 1.], shape: [2]
z:
[ 6. 9. 12.], shape: [3][2,2] matmul [2] - [2]
如果第一个参数或者第二个参数是1 维的它会提升该参数为矩阵根据另一个参数维数给该参数增加一个为1的维数。矩阵相乘之后会将为1的维数去掉。
import paddle# 定义两个输入矩阵
# x paddle.to_tensor([[1, 2], [3, 4], [5, 6]], dtypefloat32)
x paddle.to_tensor([[1, 2], [3, 4]], dtypefloat32)# y paddle.to_tensor([[2, 1], [4, 3]], dtypefloat32)
y paddle.to_tensor([2, 1], dtypefloat32)# 计算矩阵乘积
z paddle.matmul(x, y)# 打印结果
print(fx: \n{x.numpy()}, shape: {x.shape})
print(fy: \n{y.numpy()}, shape: {y.shape})
print(fz: \n{z.numpy()}, shape: {z.shape})输出结果为
x:
[[1. 2.][3. 4.]], shape: [2, 2]
y:
[2. 1.], shape: [2]
z:
[ 4. 10.], shape: [2][2] matmul [2] - [1]
import paddle# 定义两个输入矩阵
# x paddle.to_tensor([[1, 2], [3, 4], [5, 6]], dtypefloat32)
# x paddle.to_tensor([[1, 2], [3, 4]], dtypefloat32)
x paddle.to_tensor([1, 2], dtypefloat32)# y paddle.to_tensor([[2, 1], [4, 3]], dtypefloat32)
y paddle.to_tensor([2, 1], dtypefloat32)# 计算矩阵乘积
z paddle.matmul(x, y)# 打印结果
print(fx: \n{x.numpy()}, shape: {x.shape})
print(fy: \n{y.numpy()}, shape: {y.shape})
print(fz: \n{z.numpy()}, shape: {z.shape})输出结果为
x:
[1. 2.], shape: [2]
y:
[2. 1.], shape: [2]
z:
[4.], shape: [1]reference
misc{BibEntry2023Oct, title {{matmul-API文档-PaddlePaddle深度学习平台}}, year {2023}, month oct, urldate {2023-10-10}, language {chinese}, note {[Online; accessed 10. Oct. 2023]}, url {https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/matmul_cn.html} }