本文简要介绍python语言中 torch.svd 的用法。
用法:
torch.svd(input, some=True, compute_uv=True, *, out=None)out(tuple,可选的) -张量的输出元组
计算矩阵或矩阵批次
input的奇异值分解。奇异值分解表示为命名元组(U, S, V),例如input。其中 是实数输入的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)的 zero-filled 矩阵,并且与input的设备相同。当compute_uv为False时,参数some无效。支持
input的 float、double、cfloat 和 cdouble 数据类型。U和V的 dtypes 与input的相同。S将始终为实值,即使input很复杂。警告
torch.svd()已弃用,取而代之的是torch.linalg.svd(),并将在未来的 PyTorch 版本中删除。U, S, V = torch.svd(A, some=some, compute_uv=True)(默认)应替换为U, S, Vh = torch.linalg.svd(A, full_matrices=not some) V = Vh.transpose(-2, -1).conj()_, S, _ = torch.svd(A, some=some, compute_uv=False)应该替换为S = torch.svdvals(A)注意
与
torch.linalg.svd()的区别:some与torch.linalg.svd()的full_matrices相反。请注意,两者的默认值都是True,因此默认行为实际上是相反的。torch.svd()返回V,而torch.linalg.svd()返回Vh,即 。如果
compute_uv是False,则torch.svd()返回U和Vh的 zero-filled 张量,而torch.linalg.svd()返回空张量。
注意
奇异值按降序返回。如果
input是一批矩阵,则以降序返回该批中每个矩阵的奇异值。注意
如果
compute_uv是True,则S张量只能用于计算梯度。注意
当
some为False时,U[…, :, min(m, n):]和V[…, :, min(m, n):]上的梯度将在后向传递中被忽略,因为这些向量可以是相应子空间的任意基。注意
CPU 上
torch.linalg.svd()的实现使用 LAPACK 的例程?gesdd(一种分治算法)而不是?gesvd以提高速度。类似地,在 GPU 上,它在 CUDA 10.1.243 及更高版本上使用 cuSOLVER 的例程gesvdj和gesvdjBatched,在早期版本的 CUDA 上使用 MAGMA 的例程gesdd。注意
返回的
U将不连续。矩阵(或矩阵批次)将表示为列主矩阵(即Fortran-contiguous)。警告
关于
U和V的梯度只有在输入不具有零或重复奇异值时才会是有限的。警告
如果任何两个奇异值之间的距离接近于零,则相对于
U和V的梯度将在数值上不稳定,因为它们取决于 。当矩阵具有小的奇异值时也会发生同样的情况,因为这些梯度也取决于S⁻¹。警告
对于 complex-valued
input,奇异值分解不是唯一的,因为U和V可以在每一列上乘以任意相位因子 。当input具有重复的奇异值时也会发生同样的情况,其中可以将U和V中的跨越子空间的列乘以旋转矩阵和 the resulting vectors will span the same subspace 。不同的平台,如 NumPy,或不同设备类型上的输入,可能会产生不同的U和V张量。例子:
>>> 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)
参数:
关键字参数:
相关用法
- Python PyTorch svdvals用法及代码示例
- Python PyTorch svd用法及代码示例
- Python PyTorch saved_tensors_hooks用法及代码示例
- Python PyTorch sqrt用法及代码示例
- Python PyTorch skippable用法及代码示例
- Python PyTorch squeeze用法及代码示例
- Python PyTorch square用法及代码示例
- Python PyTorch save_on_cpu用法及代码示例
- Python PyTorch scatter_object_list用法及代码示例
- Python PyTorch skip_init用法及代码示例
- Python PyTorch simple_space_split用法及代码示例
- Python PyTorch sum用法及代码示例
- Python PyTorch sub用法及代码示例
- Python PyTorch sparse_csr_tensor用法及代码示例
- Python PyTorch sentencepiece_numericalizer用法及代码示例
- Python PyTorch symeig用法及代码示例
- Python PyTorch sinh用法及代码示例
- Python PyTorch sinc用法及代码示例
- Python PyTorch std_mean用法及代码示例
- Python PyTorch spectral_norm用法及代码示例
- Python PyTorch slogdet用法及代码示例
- Python PyTorch symbolic_trace用法及代码示例
- Python PyTorch shutdown用法及代码示例
- Python PyTorch sgn用法及代码示例
- Python PyTorch set_flush_denormal用法及代码示例
注:本文由纯净天空筛选整理自pytorch.org大神的英文原创作品 torch.svd。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
