Когда и где перевести тензор в cuda? - PullRequest
0 голосов
/ 12 февраля 2019

Я перенес выходной тензор в графический процессор в разных местах в моем коде (до или после изменения его значения), но получил разные результаты.В чем причина?

Сбой кода можно упростить следующим образом:

def Network(self):
    ........
    A = self.model(input)
    indexlist = self.indexlist
    output = torch.zeros(A.size(0))
    for i,li in enumerate(indexlist):
        if li:
            s,e = li
            output[i]+=sum(A[i,s:e])
    output = output if self.no_cuda else output.cuda(device=self.gpu,async=True)
    return output
pred = Network()
loss = F.nll_loss(pred,target)
loss.backward()

И RuntimeError: Функция torch :: autograd :: CopySlices вернула недопустимый градиент с индексом 1 -ожидаемый тип torch.cuda.FloatTensor, но получил torch.FloatTensor

Если я изменил одну строку следующим образом, она работает нормально:

def Network(self):
    ........
    A = self.model(input)
    indexlist = self.indexlist
    output = torch.zeros(A.size(0))
    output = output if self.no_cuda else output.cuda(device=self.gpu,async=True)
    for i,li in enumerate(indexlist):
        if li:
            s,e = li
            output[i]+=sum(A[i,s:e])
    return output
pred = Network()
loss = F.nll_loss(pred,target)
loss.backward()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...