亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

截斷 Pytorch 張量的 SVD 分解而不轉移到 cpu

截斷 Pytorch 張量的 SVD 分解而不轉移到 cpu

Helenr 2022-06-02 15:44:49
我正在 Pytorch 中訓練一個模型,我想使用截斷的 SVD 分解輸入。為了計算 SVD,我將輸入女巫是 Pytorch Cuda 張量到 CPU 并使用TruncatedSVDfrom scikit-learnperform truncate,之后,我將結果傳輸回 GPU。以下是我的模型的代碼: class ImgEmb(nn.Module):    def __init__(self, input_size, hidden_size):        super(ImgEmb, self).__init__()        self.input_size = input_size        self.hidden_size = hidden_size        self.drop = nn.Dropout(0.2)        self.mlp = nn.Linear(input_size/2, hidden_size)        self.relu = nn.Tanh()        self.svd = TruncatedSVD(n_components=input_size/2)    def forward(self, input):        svd=self.svd.fit_transform(input.cpu())        svd_tensor=torch.from_numpy(svd)        svd_tensor=svd_tensor.cuda()        mlp=self.mlp(svd_tensor)        res = self.relu(mlp)        return res我想知道是否有一種方法可以實現截斷的 SVD 而無需來回傳輸到 GPU?(因為它非常耗時并且根本沒有效率)
查看完整描述

2 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

您可以直接使用 PyTorch 的 SVD 并手動截斷它,或者您可以使用來自TensorLy的截斷 SVD和 PyTorch 后端:


import tensorly as tl

tl.set_backend('pytorch')


U, S, V = tl.truncated_svd(matrix, n_eigenvecs=10)

但是,GPU SVD 在大型矩陣上的擴展性不是很好。您還可以使用 TensorLy 的部分 svd,它仍會將您的輸入復制到 CPU,但如果您只保留幾個特征值會更快,因為它將使用稀疏特征分解。在 Scikit-learn 的截斷 SVD 中,您還可以使用 'algorithm = arpack' 來使用 Scipy 的稀疏 SVD,如果您只需要幾個組件,這可能會更快。


查看完整回答
反對 回復 2022-06-02
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

如何將張量 CUDA 轉換為 CPU?

如果您有一個 CUDA 張量,您可以使用以下指令將其傳輸到 CPU:

y_vel 它是 cuda 中的 pytorch 張量。

y_val = y_val.cpu().data.numpy()


查看完整回答
反對 回復 2022-06-02
  • 2 回答
  • 0 關注
  • 250 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號