torch.svd 向量计算奇异值分解_香博士的博客-程序员ITS301_torch.svd

技术标签: python  矩阵  深度学习  pytorch  

torch.svd(input, some=True, compute_uv=True, *, out=None) -> (Tensor, Tensor, Tensor)

计算一个矩阵或一批矩阵 input 的奇异值分解。
奇异值分解表示为namedtuple( U,S,V ),使得 input = U DIAG( S ) Vᴴ ,其中 Vᴴ 是的转置 V 为实数值的输入,或共轭转置 V 为复值输入。如果 input 是一批张量,则 U 、 S 和 V 也使用与 input 相同的批维度进行批处理。

  • 如果 some 为 True (默认),则该方法返回简化的奇异值分解,即,如果 input 的最后两个维度是 m 和 n ,则返回的 U 和 V 矩阵将仅包含 min( n, m ) 正交列。

  • 如果 compute_uv 为 False ,则返回的 U 和 V 将分别是形状为 (m × m) 和 (n × n) 的零填充矩阵,并且与 input 具有相同的设备。当 compute_uv 为 False 时, some 参数无效。

  • 支持 float、double、cfloat 和 cdouble 数据类型的输入。 U 和 V 的 dtypes与 input 的相同。 S 将始终为实值,即使 input 是复数。

Warning

torch.svd() 已弃用。请改用 torch.linalg.svd() ,它类似于 NumPy 的 numpy.linalg.svd 。

Note1

与 torch.linalg.svd() 的区别:

  • some 与 torch.linalg.svd() 的 full_matricies 相反。请注意,两者的默认值都是 True ,因此默认行为实际上是相反的。

  • torch.svd() 返回 V ,而 torch.linalg.svd() 返回 Vᴴ 。

  • 如果 compute_uv=False , torch.svd() 返回 U 和 Vh 的零填充张量,而 torch.linalg.svd() 返回空张量。
    Note

奇异值以降序返回。如果 input 是一批矩阵,则该批中每个矩阵的奇异值将按降序返回。

Note2

CPU 上的 SVD 实现使用 LAPACK 例程 ?gesdd (一种分而治之的算法)而不是 ?gesvd 来提高速度。类似地,GPU 上的 SVD 在CUDA 10.1.243 及更高版本上使用 cuSOLVER 例程 gesvdj 和 gesvdjBatched ,并在早期版本的 CUDA 上使用 MAGMA 例程 gesdd 。

Note3

返回的矩阵 U 将被转置,即步幅为 U.contiguous().transpose(-2, -1).stride() 。

Note4

如果 input 不是满秩或具有非唯一奇异值,则使用 U 和 V 计算的梯度可能不稳定。

Note5

当 some = False 时, U[…, :, min(m, n):] 和 V[…, :, min(m, n):] 和U […,:,min(m,n):]上的梯度将被向后忽略,因为这些向量可以是子空间的任意基数。

Note6

该 S 张量只能用来计算梯度,如果 compute_uv 为True。

Note7

对于复值输入,反向操作仅适用于规范不变损失函数。请查看AD中的仪表问题以获取更多详细信息。

Note8

由于SVD 的 U 和 V 不是唯一的,每个向量可以乘以任意相位因子e^{i \phi} 而 SVD 结果仍然正确。不同的平台,如 Numpy,或不同设备类型的输入,可能会产生不同的 U 和 V 张量。

Parameters

  • input ( Tensor ) – 大小为 (*, m, n) 的输入张量,其中 * 是零个或多个由 (m × n) 矩阵组成的批量维度。
  • some ( bool , optional ) – 控制是计算简化分解还是完全分解,从而控制返回的 U 和 V 的形状。默认为真。
  • compute_uv ( bool , optional ) – 是否计算 U 和 V 的选项。默认为真。
  • 關鍵字參數
    out(元组,可选)–张量的输出元组

Example:

>>> a = torch.randn(5, 3)
>>> a
tensor([[ 0.2364, -0.7752,  0.6372],
        [ 1.7201,  0.7394, -0.0504],
        [-0.3371, -1.0584,  0.5296],
        [ 0.3550, -0.4022,  1.5569],
        [ 0.2445, -0.0158,  1.1414]])
>>> u, s, v = torch.svd(a)
>>> u
tensor([[ 0.4027,  0.0287,  0.5434],
        [-0.1946,  0.8833,  0.3679],
        [ 0.4296, -0.2890,  0.5261],
        [ 0.6604,  0.2717, -0.2618],
        [ 0.4234,  0.2481, -0.4733]])
>>> s
tensor([2.3289, 2.0315, 0.7806])
>>> v
tensor([[-0.0199,  0.8766,  0.4809],
        [-0.5080,  0.4054, -0.7600],
        [ 0.8611,  0.2594, -0.4373]])
>>> torch.dist(a, torch.mm(torch.mm(u, torch.diag(s)), v.t()))
tensor(8.6531e-07)
>>> a_big = torch.randn(7, 5, 3)
>>> u, s, v = torch.svd(a_big)
>>> torch.dist(a_big, torch.matmul(torch.matmul(u, torch.diag_embed(s)), v.transpose(-2, -1)))
tensor(2.6503e-06)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42535423/article/details/121959567

智能推荐

springboot整合redis,redisTemplate 空指针_程序猿-硕的博客-程序员ITS301_redistemplate 空指针

今天创建了一个springboot项目,想整合一下redis数据库,结果redisTemplate一直未空指针异常,最后总结:出现在的原因有两点1.对@Autowired和@Resource不熟2.对spring依赖注入和new没搞明白

计算机更改虚拟内存有用吗,虚拟内存有什么用?虚拟内存怎么设置,设置多少最好..._weixin_39821874的博客-程序员ITS301

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。拟内存又叫虚拟存储器,电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存]技术,即匀出一部分硬盘空间来充当...

用XGBoost入门可解释机器学习!_Datawhale的博客-程序员ITS301

Datawhale干货来源:Scott Lundberg,来源:数据派THU本文长度为4300字,建议阅读8分钟本文为大家介绍用XGBoost解释机器学习。这是一个故事,关于错误地解...

Java学习---Day17_IO流进阶篇_非洲回归难民的博客-程序员ITS301

Java学习—Day17_IO流进阶篇缓冲流(会)基本介绍给普通的IO流, 套上一个缓冲区。 所有的使用缓冲流进行的读写操作, 都是和缓冲区进行交互的, 避免了频繁的IO操作。 这样一来, 带来的好处就是可以提高读写的效率。 这个缓冲区, 其实是一个数组。缓冲流的作用为了提高读写的能力,本身没有读写的能力,要想进行读写就必须借助于字符流/字节流实现.常⻅的缓冲流:BufferedInputStream : 缓冲字节输入流BufferedOutputStream : 缓冲字节输出流

混合索引java代码,Elasticsearch 实现拼音,中文,首字母混合搜索_weixin_39788451的博客-程序员ITS301

在实际搜索需求中,常常需要对中文做拼音搜索,首字母搜索或者中文拼音首字母混合搜索。比如要对 "广发聚财信用" 这几个中文进行拼音搜索,我们可能的搜索关键字是:“广发”,“聚财”,“guangfa”,“gfjc”,“guangfajucai”,“guangfjc”,“gfajcai”,“广发juc” 等等的混合搜索,本文主要使用elasticsearch-analysis-lc-pinyin 实现针...

python的input添加变量_在python中如何定义一个全局变量raw_input() 与 input()的区别..._weixin_39734987的博客-程序员ITS301

raw_input和input两个均是 python 的内建函数,通过读取控制台的输入与用户实现交互。但他们的功能不尽相同。下面举两个例子,来说明两者使用上的不同。例子1Python2.7.5(default,Nov182015,16:26:36)[GCC3.4.520051201(RedHat3.4.5-2)]onlinux2Type"help","copyrigh...

随便推点

overleaf(LATEX)插入表格,图片_小樊努力努力再努力的博客-程序员ITS301_overleaf插入表格

overleafoverleaf是一个 让科学更加开放、好复制、共同合作的网站。Overleaf CEO兼共同创办人是 John Hammersley 博士 在文档中国加上这个 overleaf基础入门_Junewang0614的博客-程序员ITS301_overleaf教程5.插入表格 表格科研很神器给你了,自己摸索着用,认识字就行 Create LaTeX tables online – TablesGenerator.comhttps://www.tablesgenerator.com/

idle运行python_使用IDLE运行Python PyUnit单元测试_weixin_39714565的博客-程序员ITS301

在IDLE中有没有办法直接运行PyUnit(unittest模块)单元测试?我问,因为我有一个简短的测试模块,当我运行它与python mymodule.py从Cygwin shell我得到所有测试通过,但是当我使用Run->运行模块从IDLE测试通过,但是我得到一个异常(SystemExit:False).例如,以下是一个示例测试模块来重现:#!/usr/bin/pythonimport uni...

UART接口介绍_jgw2008的博客-程序员ITS301

http://www.cnblogs.com/hzl6255/p/4297817.htmlUART接口介绍目录1. 简介2. RS2323. UART4. 连接5. Linux中UART实例 1. 简介UART, Universal Asynchronous Receiver-Transmitter, 通用异步收发传输器

由浅入深玩转华为WLAN—20 漫游系列(7)不同AC之间二层漫游【二层上线+直连式+直接转发模式】_网络之路Blog的博客-程序员ITS301

说明之前介绍过在AC间漫游的新概念以及一些处理过程,对比AC内漫游相对从配置角度来说不是非常大,只是转发的过程有点小变化,这个可以参考之前介绍的转发过程即可。二层漫游的数据包转发过程(该图中直接转发与隧道转发方式没差别)漫游前数据包的走向1、STA发送数据给HAP2、HAP收到数据报文后,发送给HAC(如果是旁挂模式的处理方式,则不太一样,在隧道模式下会转发给HAC,而直接转发方式下,直接由网关交换机直接处理业务报文交给上层设备)3、HAC收到以后,直接把业务报文送给上层网络.

json server使用以及使用npm run启动_mngss的博客-程序员ITS301_json server启动

1、使用json server(1) 下载:npm i json-server -D(2)创建mock文件夹此时项目结构如下:进入mock文件夹,输入命令:json-server --watch db.json,即可启动。 如下图:运行成功后,系统会自动在mock文件里创建db.json文件,浏览器输入localhost:3000即可访问。(3)自定义端口 json-server -watch db.json --port 端口号例如 json-server --watch db.jso

实战:k8s之NFS存储-2022.2.22_一念一生~one的博客-程序员ITS301

目录文章目录目录实验环境实验软件1、NFS 共享存储2、安装???? 案例演示:nfs服务安装(测试成功)1️⃣ `nfs server`端配置2️⃣ `nfs client`端配置3、使用????案例演示1:nfs共享存储测试(测试成功)????案例演示2:nfs共享存储,自动存储类测试(测试成功)???? 案例演示3:k8s持久化存储pv和pvc实验完整模拟(测试成功)0.搭建一个nfs存储1.创建基于NFS的PV2.创建基于NFS的PVC3.创建Pod应用挂载pvc4.创建对应存储上面的资源5.创建

推荐文章

热门文章

相关标签