[代码学习]matmul的理解与使用

2023-10-12 05:01

本文主要是介绍[代码学习]matmul的理解与使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

matmul 的理解与使用

引言:本实例以paddle框架中的matmul为例进行说明。torchnumpy中的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_x=False, transpose_y=False, name=None)

参数

  • 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 是(j,1,n,m)Tensor,另一个 y 是(k,m,p)Tensor,则 out 将是(j,k,n,p)Tensor。

实例

下面对不同维度举例,演示如何使用PaddlePaddle中的matmul函数计算两个矩阵的乘积:

[3,2] matmul [2,2] -> [3,2]

import paddle# 定义两个输入矩阵
x = paddle.to_tensor([[1, 2], [3, 4], [5, 6]], dtype='float32')
y = paddle.to_tensor([[2, 1], [4, 3]], dtype='float32')# 计算矩阵乘积
z = paddle.matmul(x, y)# 打印结果
print(f"x: \n{x.numpy()}, shape: {x.shape}")
print(f"y: \n{y.numpy()}, shape: {y.shape}")
print(f"z: \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]], dtype='float32')
# x = paddle.to_tensor([[1, 2], [3, 4]], dtype='float32')
x = paddle.to_tensor([[1, 2, 3], [4, 5, 6]], dtype='float32')# y = paddle.to_tensor([[2, 1], [4, 3]], dtype='float32')
y = paddle.to_tensor([2, 1], dtype='float32')# 计算矩阵乘积
# z = paddle.matmul(x, y)
z = paddle.matmul(y, x)# 打印结果
print(f"x: \n{x.numpy()}, shape: {x.shape}")
print(f"y: \n{y.numpy()}, shape: {y.shape}")
print(f"z: \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]], dtype='float32')
x = paddle.to_tensor([[1, 2], [3, 4]], dtype='float32')# y = paddle.to_tensor([[2, 1], [4, 3]], dtype='float32')
y = paddle.to_tensor([2, 1], dtype='float32')# 计算矩阵乘积
z = paddle.matmul(x, y)# 打印结果
print(f"x: \n{x.numpy()}, shape: {x.shape}")
print(f"y: \n{y.numpy()}, shape: {y.shape}")
print(f"z: \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]], dtype='float32')
# x = paddle.to_tensor([[1, 2], [3, 4]], dtype='float32')
x = paddle.to_tensor([1, 2], dtype='float32')# y = paddle.to_tensor([[2, 1], [4, 3]], dtype='float32')
y = paddle.to_tensor([2, 1], dtype='float32')# 计算矩阵乘积
z = paddle.matmul(x, y)# 打印结果
print(f"x: \n{x.numpy()}, shape: {x.shape}")
print(f"y: \n{y.numpy()}, shape: {y.shape}")
print(f"z: \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}
}

这篇关于[代码学习]matmul的理解与使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/193445

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1