我如何为PyTorch类张量类型做自定义梯度计算?



我正在尝试创建一个类似张量的类,我希望与PyTorch集成。该类必须以自定义格式存储张量值和梯度。我一直遵循使用类张量类型扩展torch的说明。我有一些关于梯度存储和计算的问题:

  1. 我想从(float)张量初始化我的类,并能够将其转换回来。我知道我可以使用numpy()函数从张量中检索值,但是如果我想存储,我如何获得梯度数据呢?直接访问tensor.grad是正确的方法吗?当我把它转换回张量的时候,我怎么把存储的梯度数据还给它呢?
  2. 在上面的链接中,我看到了使torch.add等功能与我的自定义类型一起工作的说明,但这似乎只处理向前通过,我还需要修改如何通过自动渐变计算梯度。如何定义火炬.add的自定义向前和向后版本?在其他地方,我看到了使用自定义函数扩展torch.autograd的指令,但我不确定这些指令是否可以与这种情况合并。是否有一种方法,我可以创建一个自定义添加函数,并说该函数的apply实现torch.add为我的类?

谢谢你
  1. 使用tensor.grad.data(检查是否grad not None!)
  2. 您可以直接对torch.Tensor执行操作还是必须是您的自定义类型?然后张量可以携带大多数函数的自梯度信息(你只需要自己计算自定义函数的梯度)。你也可以考虑子类化torch.Tensor,这将缓解很多这些问题。

最新更新