Я перенес выходной тензор в графический процессор в разных местах в моем коде (до или после изменения его значения), но получил разные результаты.В чем причина?
Сбой кода можно упростить следующим образом:
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()