Pythorch张量的SVD分解不需要转移到cpu上

2024-04-26 01:09:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Pytorch训练一个模型,我想使用截短的SVD输入分解。为了计算SVD,我将输入转换为Pytorch-Cuda张量,并使用TruncatedSVDfrom{}执行截断,然后将结果传输回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?(因为这非常耗时,而且一点效率都没有)


Tags: 模型selfinputsizegpuinitdefnn
1条回答
网友
1楼 · 发布于 2024-04-26 01:09:33

您可以直接使用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,但是如果你只保留几个特征值,它会更快,因为它将使用稀疏特征分解。如果你还需要使用Scipy的sparse-svack算法来更快的学习。在

相关问题 更多 >