我正在 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,如果您只需要幾個組件,這可能會更快。

手掌心
TA貢獻1942條經驗 獲得超3個贊
如何將張量 CUDA 轉換為 CPU?
如果您有一個 CUDA 張量,您可以使用以下指令將其傳輸到 CPU:
y_vel 它是 cuda 中的 pytorch 張量。
y_val = y_val.cpu().data.numpy()
添加回答
舉報
0/150
提交
取消