【发布时间】:2020-01-21 10:17:28
【问题描述】:
我正在 Pytorch 中训练一个模型,我想对输入使用截断的 SVD 分解。为了计算 SVD,我将输入女巫是 Pytorch Cuda Tensor 传输到 CPU,并使用 scikit-learn 中的 TruncatedSVD 执行截断,之后,我将结果传输回 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? (因为它非常耗时,而且根本没有效率)
【问题讨论】:
标签: python scikit-learn pytorch svd