首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pytorch张量的截断SVD分解

Pytorch张量的截断SVD分解
EN

Stack Overflow用户
提问于 2019-09-20 18:49:41
回答 2查看 1.1K关注 0票数 2

我正在Pytorch中训练一个模型,我想使用输入的截断SVD分解。为了计算奇异值分解,我将Pytorch Cuda张量的输入传递给中央处理器,并使用scikit-learn中的TruncatedSVD进行截断,然后将结果传送回图形处理器。以下是我的模型的代码:

代码语言:javascript
复制
 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?(因为它非常耗时,而且效率很低)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-04 21:47:03

你可以直接使用PyTorch的SVD并手动截断它,或者你可以通过PyTorch后端使用来自TensorLy的截断的SVD:

代码语言:javascript
复制
import tensorly as tl
tl.set_backend('pytorch')

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

然而,GPU SVD在大型矩阵上的伸缩性不是很好。你也可以使用TensorLy的partial svd,它仍然会将你的输入复制到CPU中,但如果你只保留几个特征值,速度会快得多,因为它将使用稀疏的特征分解。在Scikit-learn的截断SVD中,你还可以使用'algorithm = arpack‘来使用Scipy的稀疏SVD,如果你只需要几个组件,它可能会更快。

票数 1
EN

Stack Overflow用户

发布于 2020-09-17 16:41:45

如何将张量CUDA转换为CPU?

如果您有CUDA张量,您可以使用以下指令将其传输到CPU:

y_vel,它是cuda中的pytorch张量。

代码语言:javascript
复制
y_val = y_val.cpu().data.numpy()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58026949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档