为了账号安全,请及时绑定邮箱和手机立即绑定

截断 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 关注
  • 330 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号