PyTorch学习笔记之基础函数篇(八)

6 线性代数运算

6.1 torch.mm()函数

torch.mm() 是 PyTorch 中的一个函数,用于执行矩阵乘法操作。这个函数会接受两个张量作为输入,并返回它们的矩阵乘积。

函数的基本语法如下:

torch.mm(mat1, mat2) → Tensor

参数说明:

  • mat1 (Tensor):第一个要进行矩阵乘法的张量。通常是一个二维张量(矩阵)。
  • mat2 (Tensor):第二个要进行矩阵乘法的张量。也通常是一个二维张量(矩阵)。

torch.mm() 函数返回一个新的张量,它是 mat1 和 mat2 的矩阵乘积。注意,mat1 的列数必须等于 mat2 的行数,以满足矩阵乘法的规则。

下面是一个使用 torch.mm() 的例子:

import torch# 创建两个矩阵
mat1 = torch.tensor([[1, 2], [3, 4]])
mat2 = torch.tensor([[5, 6], [7, 8]])# 计算矩阵乘积
result = torch.mm(mat1, mat2)print(result)
# 输出:
# tensor([[19, 22],
#         [43, 50]])

在这个例子中,mat1 和 mat2 都是 2x2 的矩阵。使用 torch.mm() 函数计算了它们的矩阵乘积,并打印了结果。

需要注意的是,虽然 torch.mm() 通常用于二维矩阵的乘法,但 PyTorch 还提供了其他函数如 torch.matmul() 来执行更一般的张量乘法,它可以处理更高维度的张量,并提供了更灵活的广播能力。如果你需要处理更复杂的张量乘法,可能需要使用 torch.matmul() 而不是 torch.mm()。

6.2 torch.bmm()函数

torch.bmm 是 PyTorch 中的一个函数,用于执行批量矩阵乘法。这个函数在深度学习中特别有用,特别是在处理一批样本时,每个样本都是一个矩阵,你想要对这批样本执行矩阵乘法。

函数的基本语法如下:
参数说明:

  • batch1 (Tensor): 第一个批量矩阵,通常是一个三维张量,其中第一个维度是批量大小(batch size),第二和第三个维度分别是矩阵的行和列。
  • batch2 (Tensor): 第二个批量矩阵,也是一个三维张量,其形状与 batch1 兼容,即第一个维度是批量大小,第二维度的大小应与 batch1 的第三维度相同(用于矩阵乘法),第三维度的大小定义了结果矩阵的列数。

torch.bmm() 函数返回一个新的三维张量,其第一个维度是批量大小,第二维度是 batch1 的第二维度大小,第三维度是 batch2 的第三维度大小。

下面是一个使用 torch.bmm() 的例子:

import torch# 创建两个批量矩阵
batch1 = torch.randn(10, 3, 4)  # 批量大小为 10,每个矩阵 3x4
batch2 = torch.randn(10, 4, 5)  # 批量大小为 10,每个矩阵 4x5# 执行批量矩阵乘法
result = torch.bmm(batch1, batch2)print(result.size())  # 输出: torch.Size([10, 3, 5])

在这个例子中,batch1 和 batch2 都是包含 10 个矩阵的批量,每个矩阵分别具有不同的维度。torch.bmm() 函数对这两个批量中的每个矩阵执行矩阵乘法,并返回一个包含 10 个矩阵的新批量,每个矩阵是 3x5 的。

需要注意的是,torch.bmm() 只支持批量矩阵乘法,并且输入的张量必须是三维的。如果你想要执行普通的矩阵乘法,可以使用 torch.mm() 或 torch.matmul()。

6.3 torch.matmul()函数

torch.matmul 是 PyTorch 中的一个函数,用于执行矩阵乘法或更高维度的张量乘法。这个函数能够处理从向量到矩阵以及更高维度的张量,提供了比 torch.mm 和 torch.bmm 更广泛的功能。

函数的基本语法如下:

torch.matmul(tensor1, tensor2, *, out=None) → Tensor

参数说明:

  • tensor1 (Tensor):第一个张量。
  • tensor2 (Tensor):第二个张量。
  • *:其他命名参数。
  • out (Tensor, optional):输出张量。

torch.matmul 的工作方式是,它会根据输入张量的维度和形状来确定执行什么样的乘法操作。如果输入的是两个向量,则执行点积;如果输入的是两个矩阵,则执行矩阵乘法;如果输入的是更高维度的张量,则执行逐元素的广播乘法。

这里有一些使用 torch.matmul 的例子:

例子 1:向量点积

import torchv1 = torch.tensor([2, 3])
v2 = torch.tensor([6, 7])# 执行点积
result = torch.matmul(v1, v2)print(result)  # 输出: tensor(20)

例子 2:矩阵乘法

import torchmat1 = torch.tensor([[1, 2], [3, 4]])
mat2 = torch.tensor([[5, 6], [7, 8]])# 执行矩阵乘法
result = torch.matmul(mat1, mat2)print(result)
# 输出:
# tensor([[19, 22],
#         [43, 50]])

例子 3:张量乘法(广播)

import torchtensor1 = torch.tensor([[1, 2], [3, 4]])
tensor2 = torch.tensor([5, 6])# 执行逐元素的张量乘法(广播)
result = torch.matmul(tensor1, tensor2)print(result)
# 输出:
# tensor([[ 5, 12],
#         [15, 24]])

在最后一个例子中,tensor1 是一个 2x2 的矩阵,而 tensor2 是一个 1x2 的矩阵。由于 tensor2 的形状可以广播到与 tensor1 兼容的形状(即 2x2),因此 torch.matmul 执行了逐元素的乘法。

torch.matmul 提供了比 torch.mm 和 torch.bmm 更强大的功能,因为它能够处理不同维度的张量,并且具有广播能力。在处理深度学习模型时,通常推荐使用 torch.matmul 而不是 torch.mm,因为它更加灵活和通用。

6.4 torch.eig()函数

torch.eig 是 PyTorch 中的一个函数,用于计算一个方阵的特征值和特征向量。这个函数返回一个元组,其中第一个元素是特征值组成的张量,第二个元素是对应的特征向量组成的张量。

函数的基本语法如下:

torch.eig(input, eigenvectors=False, *, out=None)(Tensor, Tensor)

参数说明:

  • input (Tensor): 要计算特征值和特征向量的方阵。
  • eigenvectors (bool, optional): 如果为 True,则计算特征向量;如果为 False,则只计算特征值。默认为 False。
  • *: 其他命名参数。
  • out (tuple[Tensor, Tensor], optional): 可选的输出张量元组,用于存储特征值和特征向量。

返回值是一个包含两个张量的元组:

  • 第一个张量包含输入矩阵的特征值。
  • 第二个张量(如果 eigenvectors=True)包含与特征值对应的特征向量。

以下是一个使用 torch.eig 的例子:

import torch# 创建一个方阵
A = torch.tensor([[4, 1], [2, 3]], dtype=torch.float32)# 计算特征值和特征向量
eigenvalues, eigenvectors = torch.eig(A, eigenvectors=True)print("Eigenvalues:")
print(eigenvalues)print("Eigenvectors:")
print(eigenvectors)

输出将类似于以下内容:

Eigenvalues:
tensor([-0.5437,  5.5437])
Eigenvectors:
tensor([[-0.8165, -0.5774],[ 0.5774, -0.8165]])

在这个例子中,A 是一个 2x2 的方阵,torch.eig 计算了它的特征值和特征向量。特征值是两个标量(在这个例子中为 -0.5437 和 5.5437),而特征向量是两个正交向量(在这个例子中由两列组成的矩阵表示)。

6.5 torch.inverse()函数

torch.inverse 是 PyTorch 中的一个函数,用于计算矩阵的逆。这个函数返回输入矩阵的逆矩阵。如果输入矩阵是奇异的(即不可逆),则该函数会抛出错误。

函数的基本语法如下:

torch.inverse(input, *, out=None) → Tensor

参数说明:

  • input (Tensor):要计算逆的矩阵。
  • *:其他命名参数。
  • out (Tensor, optional):输出张量。

返回值是一个张量,表示输入矩阵的逆矩阵。

以下是一个使用 torch.inverse 的例子:

import torch# 创建一个可逆矩阵
A = torch.tensor([[4, 1], [2, 3]], dtype=torch.float32)# 计算逆矩阵
A_inv = torch.inverse(A)print("Original matrix A:")
print(A)print("Inverse of matrix A:")
print(A_inv)# 验证逆矩阵的正确性
I = torch.matmul(A, A_inv)
print("Identity matrix (should be close to I):")
print(I)

输出将类似于以下内容

Original matrix A:
tensor([[4., 1.],[2., 3.]])
Inverse of matrix A:
tensor([[-0.75,  0.25],[ 0.5 , -0.25]])
Identity matrix (should be close to I):
tensor([[1.0000, 0.0000],[0.0000, 1.0000]])

在这个例子中,A 是一个 2x2 的可逆矩阵,torch.inverse 计算了它的逆矩阵 A_inv。最后,通过矩阵乘法验证了 A 和 A_inv 的乘积接近单位矩阵 I,这验证了逆矩阵的正确性。

请注意,如果输入矩阵不是方阵(即行数和列数不相等),或者矩阵是奇异的(即没有逆矩阵),torch.inverse 会抛出错误。在这种情况下,你可能需要使用其他方法(如求解线性方程组或计算伪逆矩阵)来处理矩阵。

6.6torch.cholesky()函数

torch.cholesky 是 PyTorch 中的一个函数,用于计算一个正定矩阵(positive-definite matrix)的 Cholesky 分解。Cholesky 分解是一种将一个正定矩阵分解为一个下三角矩阵(以主对角线为轴进行镜像对称)和其转置的乘积的方法。

函数的基本语法如下:

torch.cholesky(input, upper=False, *, out=None) → Tensor

参数说明:

  • input (Tensor): 要进行 Cholesky 分解的正定矩阵。
  • upper (bool, optional): 如果为 True,则输入矩阵被假定为上三角矩阵,且函数返回上三角 Cholesky 因子。默认为 False,表示输入矩阵是下三角的。
  • *: 其他命名参数。
  • out (Tensor, optional): 可选的输出张量。

返回值是一个张量,表示输入矩阵的 Cholesky 分解的下三角因子(如果 upper=False)或上三角因子(如果 upper=True)。

以下是一个使用 torch.cholesky 的例子:

import torch# 创建一个正定矩阵
A = torch.tensor([[4., 12., -16.],[12., 37., -43.],[-16., -43., 98.]], dtype=torch.float32)# 计算 Cholesky 分解
L = torch.cholesky(A)print("Original matrix A:")
print(A)print("Cholesky factor L:")
print(L)# 验证分解的正确性:A = L * L.T
A_reconstructed = torch.matmul(L, L.t())
print("Reconstructed matrix A_reconstructed:")
print(A_reconstructed)

输出将类似于以下内容:

Original matrix A:
tensor([[ 4., 12., -16.],[12., 37., -43.],[-16., -43.,  98.]], dtype=torch.float32)
Cholesky factor L:
tensor([[ 2.0000,  0.0000,  0.0000],[ 6.0000,  1.0000,  0.0000],[-8.0000, -5.0000,  3.2016]], dtype=torch.float32)
Reconstructed matrix A_reconstructed:
tensor([[ 4.0000, 12.0000, -16.0000],[12.0000, 37.0000, -43.0000],[-16.0000, -43.0000,  98.0001]], dtype=torch.float32)

在这个例子中,A 是一个正定矩阵,torch.cholesky 计算了它的 Cholesky 分解因子 L。最后,通过计算 L 和其转置的乘积,验证了重构的矩阵 A_reconstructed 与原始矩阵 A 相等(由于数值误差,可能会有轻微的不同)。

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

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

相关文章

根据服务器系统选择对应的MySQL版本

1. 根据服务器系统选择对应的MySQL版本 MySQL有多个版本,选择对应的版本,重点信息是Linux的GLIBC版本号,Linux的版本、系统位数。 1.1 查看Linux的GLIBC版本号 通常libc.so会支持多个版本,即向前兼容,查看该文件中…

Linux lsattr命令教程:如何查看和理解文件属性(附实例详解和注意事项)

Linux lsattr命令介绍 lsattr命令是list attributes的缩写,主要用于列出Linux系统文件的属性。这个命令可以帮助我们了解文件的各种属性,比如是否可以被修改、删除等。 Linux lsattr命令适用的Linux版本 lsattr命令在大多数Linux发行版中都可以使用&a…

LLM预备知识、工具篇——LLM+LangChain+web UI的架构解析

目录 【常见名词】一、LLM的低资源模型微调二、向量数据库1、Milvus(v2.1.4):云原生自托管向量数据库(Ubuntu下)1)安装(Docker Compose方式):2)管理工具(仅支持Milvus 2.…

RabbitMQ命令行监控命令详解

在分布式系统中,消息队列中间件如RabbitMQ扮演着至关重要的角色。为了保证系统的稳定性和高可用性,对RabbitMQ进行有效监控是必不可少的。本文将详细介绍RabbitMQ提供的命令行工具rabbitmqctl,这些工具可以帮助我们监控和管理RabbitMQ服务器。…

adb 筛选查看Unity日志

在Windows系统中,使用ADB(Android Debug Bridge)查看Unity应用的日志是一个常见的需求,尤其是在开发或调试Android平台上的Unity游戏或应用时。以下是一些基本步骤和命令,帮助你通过ADB获取Unity日志。 在Linux或Mac …

rank() over, dense_rank() over, row_number() over的区别

rank() over, dense_rank() over, row_number() over的区别 --ROW_NUMBER() OVER 不需要考虑并列,即使查询出来的数值相同也会进行连续排名 SELECT NAME, STUNO, SUBJECT, SCORE, ROW_NUMBER() OVER(PARTITION BY SUBJECT ORDER BY SCORE DESC) TO_RANK FROM SCOTT…

Python分类汇总N张Excel表中的数据(附源码下载)

在现代办公环境中,处理大量的Excel表格是一项常见而又繁琐的任务。Python作为一种功能强大的编程语言,其在自动化办公方面的表现尤为出色。例如,我们可以使用Python进行Excel表格的分类汇总操作。 具体来说,我们可以创建一个名为“…

Learn OpenGL 03 着色器

GLSL 着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。 一个典型的着色器有下面的结构: #version vers…

O2OA(翱途)开发平台系统安全-用户登录IP限制

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持对指定的用户设置可以连接的客户端计算机的IP地址,以避免用户在不安全的环境下访问系统。本篇主要介绍如何开启O2OA用户登录IP限制。 一、先决条件: 1、O2Server服务器正常运行,系统安装部…

PostgreSQL开发与实战(6.3)体系结构3

作者:太阳 四、物理结构 4.1 软件安装目录 bin //二进制可执行文件 include //头文件目录 lib //动态库文件 share //文档以及配置模版文件4.2 数据目录 4.2.1 参数文件 pg_hba.conf //认证配置文件 p…

C++ string详解+模拟实现

文章目录 写在前面1. string类的使用1.1 string类的构造1.2 string类的迭代器1.3 string类对象的容量操作1.4 string类对象的修改操作1.5 string类对象的非成员函数 2. string类的模拟实现2.1 模拟实现string类的默认成员函数2.2 模拟实现string类的迭代器2.3 模拟实现string类…

dpdk-19.11 对向量指令的使用情况分析

不同向量指令识别关键字 __m128i sse uint64x2_t neon __m256i avx2 __m512i avx512 vector altivec dpdk 向量收发包函数 支持 arm neno 向量收发包函数的 pmd 驱动 bnxt hns3 i40e ixgbe mlx5 virtio 支持 sse 向量收发包函数的 pmd 驱动 axgbe hinic fm10k bnxt i40e …

如何本地部署SeaFile文件共享服务并实现无公网IP访问内网本地文件

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c…

JavaWeb后端——分层解耦 IOC DI

分层/三层架构概述 三层架构:Controller、Service、Dao 解耦/IOC&DI概述 分层解耦 容器称为:IOC容器/Spring容器 IOC 容器中创建,管理的对象,称为:bean 对象 IOC&DI入门 实现 IOC&DI 需要的注解&#…

el-table左键双击单元格编辑内容(输入框输入计算公式可直接得出结果),右键单击展示操作菜单,可编辑单元格高亮展示

vue2点击左侧的树节点&#xff08;el-tree&#xff09;定位到对应右侧树形表格(el-table)的位置&#xff0c;树形表格懒加载 表格代码 <el-table ref"singleTable" :data"detailsList" highlight-current-row"" row-key"detailId"…

微信小程序Java后台获取手机号

小程序端&#xff1a; wx.request({url: registerphone, //自己的地址data: {openid: openid,encryptedData: encryptedData, //手机加密数据iv: iv, // 加密ivsession_key: session_key,// 加密key},method: "post",header: {"content-type": "appli…

Python基于大数据的豆瓣电影分析,豆瓣电影可视化系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

大模型应用开发-大模型token等基本概念及参数和内存的关系

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

芒果YOLOv8改进106:卷积Conv篇:DO-DConv卷积提高性能涨点,使用over-parameterized卷积层提高CNN性能

芒果YOLOv8改进106:卷积Conv篇:DO-DConv卷积提高性能涨点,使用over-parameterized卷积层提高CNN性能 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接: 芒果YOLOv8深度改进教程 文章目录 DO-DConv论文理论部分…

深度学习_20_卷积中的填充与步幅

如果图片本身比较小&#xff0c;卷积之后输出也会很小&#xff0c;那么可以在图片与卷积核相乘之前先填充一下&#xff0c;让输出为预期大小 一般填充后输入&#xff0c;输出相同 当图片比较大的时候&#xff0c;如果利用卷积核去得到我们想要的大小的话&#xff0c;得用到多层…