Усеченное SVD-разложение тензора Pytorch без перехода на процессор - PullRequest
1 голос
/ 20 сентября 2019

Я тренирую модель в Pytorch и хочу использовать усеченную SVD-декомпозицию ввода.Для вычисления SVD я передаю входной сигнал, являющийся Cuda Tensor Pytorch, в CPU и, используя TruncatedSVD из scikit-learn выполнить усечение, после этого я передаю результат обратно в 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?(Потому что это очень много времени и совсем не эффективно)

...