當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。