[代码学习]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}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文带你了解 Linux 的 Cache 与 Buffer

目录 前言一、Cache二、Buffer三、Linux 系统中的 Cache 与 Buffer总结 前言 内存的作用是什么?简单的理解,内存的存在是为了解决高速传输设备与低速传输设备之间数据传输速度不和谐而设立的中间层(学过计算机网络的应该都知道,这…

【内网穿透】Docker部署Drupal并实现公网访问

目录 前言 1. Docker安装Drupal 2. 本地局域网访问 3 . Linux 安装cpolar 4. 配置Drupal公网访问地址 5. 公网远程访问Drupal 6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS,适用于各种不同的网站项目,从小型个人博客到大型企业级门户网站。…

【Python】实现excel文档中指定工作表数据的更新操作

在做数值计算时,个人比较习惯利用excel文档的公式做数值计算进行对比,检查异常,虽然计算量大后,excel计算会比较缓慢,但设计简单,易排错 但一般测试过程中使用到的数据都不是最终数值,会不停根据…

红队专题-从零开始VC++远程控制软件RAT-C/S-[1]远控介绍及界面编写

红队专题 招募六边形战士队员[1]---远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境:3.界面编程新建项…

实现基于 GitLab 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节,也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中,像处理代码那样处理数据库变更呢? DORA 调研报告 DORA(DevOps Research &am…

前后端分离项目-基于springboot+vue的足球青训俱乐部管理后台系统的设计与实现(内含代码+文档+报告)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

用于物体识别和跟踪的下游任务自监督学习-1-引言

一:引言: 图像和视频理解是计算机视觉应用中的基本问题,旨在使机器能够像人类一样解释和理解视觉数据。这些问题涉及识别图像和视频中的对象、人物、动作、事件和场景。如图1.1-(a)所示的图像识别任务包括对象检测[1]…

Python 对字符串切片及翻转(毫无含金量)

给定一个字符串,从头部或尾部截取指定数量的字符串,然后将其翻转拼接。 def rotate(input,d):lfirstinput[0:d]lsecondinput[d:]rfirstinput[0:len(input)-d]rsecondinput[len(input)-d:0]print("头部切片反转:",(lsecondlfirst))…

Netty深入浅出Java网络编程学习笔记(一) Netty入门篇

目录 一、概述 1、什么是Netty 2、Netty的优势 二、入门案例 1、服务器端代码 2、客户端代码 3、运行流程 组件解释 三、组件 1、EventLoop 处理普通与定时任务 关闭 EventLoopGroup 处理IO任务 服务器代码 客户端代码 分工细化 划分Boss 和Work 增加自定义EventLoopGroup 切换…

云计算:常用运维软件工具

目录 一、理论 1.云管理工具 2.虚拟化工具 3.容器管理工具 4.运维自动化工具 5.版本控制工具 6.配置管理工具 7.编辑器工具 8.代码质量工具 9.网络管理工具 10.数据库管理工具 11.数据中心设备管理工具 12.数据可视化工具 13.服务器管理工具 14.应用性能管理工具…

银河麒麟安装arm架构mysql8

1. 准备工作 2. 查看麒麟系统版本 使用命令 Linux version 4.19.90-25.21.v2101.ky10.aarch64 (KYLINSOFTlocalhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Wed Sep 28 16:37:42 CST 2022可以看出这是麒麟 v10 ,aarch64 (ARM 架构的&#xff…

【d2l动手学深度学习】 Lesson 10 多层感知机 + 代码实现 试验结果对比

文章目录 1. 介绍2. 单层Softmax回归2.1 手写Softmax训练效果 2.2 调用pytorch内置的softmax回归层实现调用pytorch内置softmax实验结果总结 3. 一层感知机(MLP) Softmax实验结果 Reference写在最后 1. 介绍 在第十节课 多层感知机 的代码实现部分&…

机器学习1:k 近邻算法

k近邻算法(k-Nearest Neighbors, k-NN)是一种常用的分类和回归算法。它基于一个简单的假设:如果一个样本的k个最近邻居中大多数属于某一类别,那么该样本也很可能属于这个类别。 k近邻算法的步骤如下: 输入&#xff1a…

JVM第二讲:JVM 基础 - 字节码详解

JVM 基础 - 字节码详解 本文是JVM第二讲,JVM 基础-字节码详解。源代码通过编译器编译为字节码,再通过类加载子系统进行加载到JVM中运行。 文章目录 JVM 基础 - 字节码详解1、多语言编译为字节码在JVM运行2、Java字节码文件2.1、Class文件的结构属性2.2、…

Linux shell编程学习笔记10:expr命令 和 算术运算

Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算。上节我们研究了 Linux shell编程 中的 字符串运算,今天我们研究 Linux shell编程的算术运算 ,为了方便举例,我们同时对expr命令进行…

centos 安装svn

卸载 yum remove subversion安装 yum -y install subversion仓库目录 mkdir -p /home/svn/project版本目录 svnadmin create /home/svn/project主目录切换 cd /home/svn/project/conf服务配置 vim svnserve.confanon-access read auth-access write …

TomCat关键技术

一、Tomcat 是什么 Tomcat 是一个 HTTP 服务器。通过前面的学习,我们知道HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式,同时也通过 ajax 和 Java Socket 分别构造了 HTTP 客户端。HTTP 服务器我们也同样可以通过 Java Socket 来实现. 而 Tomcat 就是基于 J…

hive add columns 后查询不到新字段数据的问题

分区表add columns 查询不到新增字段数据的问题; 5.1元数据管理 (1)基本架构 Hive的2个重要组件:hiveService2 和metastore,一个负责转成MR进行执行,一个负责元数据服务管理 beeline-->hiveService2/spar…

优思学院|八大浪费深度剖析

在工作流程中消除浪费是精益思想的目标。在深入探讨八大浪费之前,了解浪费的定义至关重要。浪费是指工作流程中的任何行动或步骤,这些行动或步骤不为客户增加价值。换句话说,浪费是客户不愿意为其付费的任何过程。 最初的七大浪费&#xff0…

竞赛选题 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…