Edit:
Вот подробное объяснение того, что происходит («само по себе это не ошибка, но это определенно источник путаницы»): https://github.com/pytorch/pytorch/issues/19778
Таким образом, одно из решений состоит в том, чтобы специально попросить оставить града на данный момент не-лист a
:
a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)
a.retain_grad()
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()
Старый ответ:
Если вы переместите a.requires_grad = True
после изменения формы, это сработает:
a = torch.tensor([1.])
a = a.reshape(a.shape)
a.requires_grad = True
b = torch.tensor([1.])
c = torch.cat([a,b])
d = torch.sum(c)
d.backward()
Похоже, ошибка в PyTorch, потому что после этого a.requires_grad
все еще верно.
a = torch.tensor([1.])
a.requires_grad = True
a = a.reshape(a.shape)
Похоже, это связано с тем фактом, что a
больше не является листом в вашем примере "Не работает", но все же является листом в других случаях (напечатайте a.is_leaf
для проверки).