201208 PyTorch求解矩陣正交基

2021-10-11 17:38:27 字數 2744 閱讀 8247

orth is obtained from u in the singular value decomposition, [u,s] = svd(a,『econ』). if r = rank(a),the first r columns of uform an orthonormal basis for the range of a.

**

from scipy import linalg as la

import torch

# step 1: 建立相關矩陣

print('step 1: 建立相關矩陣')

a = np.array([[1.,0,1],[0,1,0],[1,0,1]])

b = torch.tensor(a)

print(b)

print('\n')

# step 2: 求矩陣的秩

print('step 2: 求矩陣的秩')

r = torch.matrix_rank(b)

print(r)

print('\n')

# step 3: 矩陣的svd分解

print('step 3: 矩陣的svd分解及正交基索引')

u,s,v = torch.svd(b)

torchresult = u[:,:r]

print('u:\n',u)

print('s:\n',s)

print('v:\n',v)

print('\n')

# step 4: 對比scipy直接計算與pytorch間接計算結果

print('step 4: 對比scipy直接計算與pytorch間接計算結果')

scipyresult = la.orth(b)

print('scipy.la.orth():\n',scipyresult)

scipyresult.dtype

print('scipyresult - torchresult\n',torch.dist(torch.tensor(scipyresult), torchresult,2))

step 1: 建立相關矩陣

tensor([[1., 0., 1.],

[0., 1., 0.],

[1., 0., 1.]])

step 2: 求矩陣的秩

tensor(2)

step 3: 矩陣的svd分解及正交基索引

u: tensor([[-0.7071, 0.0000, 0.7071],

[ 0.0000, -1.0000, 0.0000],

[-0.7071, 0.0000, -0.7071]])

s: tensor([2.0000e+00, 1.0000e+00, 1.3491e-08])

v: tensor([[-7.0711e-01, -0.0000e+00, 7.0711e-01],

[ 0.0000e+00, -1.0000e+00, 0.0000e+00],

[-7.0711e-01, -1.1921e-07, -7.0711e-01]])

step 4: 對比scipy直接計算與pytorch間接計算結果

scipy.la.orth():

[[-0.7071068 0. ]

[ 0. -1. ]

[-0.70710677 0. ]]

scipyresult - torchresult

tensor(0.)

def torchorth(a):

r = torch.matrix_rank(a)

u,s,v = torch.svd(a)

return u[:,:r]

a = np.array([[1.,0,1],[0,1,0],[1,0,1]])

b = torch.tensor(a)

torchorth(b)

當引數過大的時候,仍舊存在一定的誤差, 此時可設定64位精度

torch.set_default_dtype(torch.float64)

def torchorth(a):

r = torch.matrix_rank(a)

u,s,v = torch.svd(a)

return u[:,:r]

nfea = 10

nwin = 10

nort = 500

randomoth = random.randn(nwin * nfea + 1, nort)

if nfea * nwin >= nort:

wenh1 = la.orth(2 * randomoth)-1

else:

wenh1 = la.orth(2 * randomoth.t-1).t

randomoth = torch.tensor(randomoth)

if nfea * nwin >= nort:

wenh2 = torchorth(2 * randomoth)-1

else:

wenh2 = torchorth(2 * randomoth.t-1).t

torch.dist(torch.tensor(wenh1),wenh2,2)

Pytorch自動求解梯度

要理解pytorch求解梯度,首先需要理解pytorch當中的計算圖的概念,在計算圖當中每乙個variable都代表的乙個節點,每乙個節點就可以代表乙個神經元,我們只有將變數放入節點當中才可以對節點當中的變數求解梯度,假設我們有乙個矩陣 1.2.3.4.5.6.我們將這個矩陣 二維張量 首先在pyt...

PyTorch 矩陣乘法總結

torch.mm mat1,mat2,out none 其中mat1 n times m mat2 m times d 輸出out的維度是 n times d 該函式一般只用來計算兩個二維矩陣的矩陣乘法,並且不支援broadcast操作。由於神經網路訓練一般採用mini batch,經常輸入的時三維...

《演算法》蛇形矩陣求解

蛇形矩陣 右下,下左,左上,上右,迴圈往復 如果每次迴圈都計算x,y當前的極限值會很耗費效能,不如讓x和y直接越界,當越界的點不存在時,再回退一步,並按照 對方 上次的極限值 最大或最小 去確定 正確的轉向方向 左或右 import time import sys x變化或y變化 x和y只能有乙個工...