当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python PyTorch svd用法及代码示例


本文简要介绍python语言中 torch.svd 的用法。

用法:

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

参数

  • input(Tensor) -大小为 (*, m, n) 的输入张量,其中 * 是零个或多个由 (m, n) 矩阵组成的批量维度。

  • some(bool,可选的) -控制是计算简化分解还是完全分解,从而控制返回的 UV 的形状。默认值:True

  • compute_uv(bool,可选的) -控制是否计算 UV 。默认值:True

关键字参数

out(tuple,可选的) -张量的输出元组

计算矩阵或矩阵批次 input 的奇异值分解。奇异值分解表示为命名元组 (U, S, V) ,例如 input 。其中 是实数输入的V 的转置,以及复杂输入的V 的共轭转置。如果 input 是一批矩阵,则 USV 也使用与 input 相同的批量维度进行批处理。

如果someTrue(默认),则该方法返回简化的奇异值分解。在这种情况下,如果 input 的最后两个维度是 mn ,则返回的 UV 矩阵将仅包含 min(n, m) 正交列。

如果 compute_uvFalse ,则返回的 UV 将分别是形状为 (m, m)(n, n) 的 zero-filled 矩阵,并且与 input 的设备相同。当 compute_uvFalse 时,参数 some 无效。

支持 input 的 float、double、cfloat 和 cdouble 数据类型。 UV 的 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_uvFalse ,则 torch.svd() 返回 UVh 的 zero-filled 张量,而 torch.linalg.svd() 返回空张量。

注意

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

注意

如果 compute_uvTrue ,则 S 张量只能用于计算梯度。

注意

someFalse 时,U[…, :, min(m, n):]V[…, :, min(m, n):] 上的梯度将在后向传递中被忽略,因为这些向量可以是相应子空间的任意基。

注意

CPU 上 torch.linalg.svd() 的实现使用 LAPACK 的例程 ?gesdd(一种分治算法)而不是 ?gesvd 以提高速度。类似地,在 GPU 上,它在 CUDA 10.1.243 及更高版本上使用 cuSOLVER 的例程 gesvdjgesvdjBatched,在早期版本的 CUDA 上使用 MAGMA 的例程 gesdd

注意

返回的U 将不连续。矩阵(或矩阵批次)将表示为列主矩阵(即Fortran-contiguous)。

警告

关于UV 的梯度只有在输入不具有零或重复奇异值时才会是有限的。

警告

如果任何两个奇异值之间的距离接近于零,则相对于 UV 的梯度将在数值上不稳定,因为它们取决于 。当矩阵具有小的奇异值时也会发生同样的情况,因为这些梯度也取决于 S⁻¹

警告

对于 complex-valued input,奇异值分解不是唯一的,因为 UV 可以在每一列上乘以任意相位因子 。当 input 具有重复的奇异值时也会发生同样的情况,其中可以将 UV 中的跨越子空间的列乘以旋转矩阵和 the resulting vectors will span the same subspace 。不同的平台,如 NumPy,或不同设备类型上的输入,可能会产生不同的 UV 张量。

例子:

>>> 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)

相关用法


注:本文由纯净天空筛选整理自pytorch.org大神的英文原创作品 torch.svd。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。