【问题标题】:PyTorch: Differentiable operations to go from coordinate tensor to grid tensorPyTorch:从坐标张量到网格张量的可微操作
【发布时间】:2020-10-21 09:45:33
【问题描述】:

我有一个看起来像的张量

coords = torch.Tensor([[0, 0, 1, 2],
                       [0, 2, 2, 2]])

第一行是网格上对象的 x 坐标,第二行是对应的 y 坐标。

我需要一种可微的方式(即梯度可以流动)从这个张量到相应的“网格”张量,其中 1 表示该位置存在对象(行索引,列索引),0 表示没有对象:

grid = torch.Tensor([[1, 0, 1], 
                     [0, 0, 1],
                     [0, 0, 1]])

一般情况下,coords 可以很大(网格大小为 300x300)。如果coords 是稀疏张量,我可以简单地调用to_dense,但由于特定于我的应用程序的各种原因,我不能将coords 存储为稀疏。此外,我无法从 coords 创建一个新的稀疏张量并在其上调用 to_dense,因为创建一个新的张量是不可微的。

感谢任何帮助!

【问题讨论】:

  • 您能否更具体地了解一种从该张量到相应网格张量的可微方法
  • 可微分是指梯度可以流动并且不会被操作阻塞(例如创建新张量)。
  • 好的,那么网格将被输入到某个神经网络,坐标是需要通过网格从该神经网络接收梯度的变量?

标签: pytorch linear-algebra gradient-descent


【解决方案1】:

我不确定您所说的“可微分”是什么意思,但这里有一个使用高级索引的简单方法。

coords = coords.long()
grid[coords[0],coords[1]] = 1

tensor([[1., 0., 1.],
        [0., 0., 1.],
        [0., 0., 1.]])

我认为 Torch 没有关于此的详细文档,但 numpyhere。 (可能与火炬非常相似)

这也是可以的

coords = coords.long()
grid[coords[0],coords[1]] = torch.Tensor([1,2,3,4])

tensor([[1., 0., 2.],
        [0., 0., 3.],
        [0., 0., 4.]])

【讨论】:

  • 感谢您的建议!不幸的是,这也是不可区分的(即梯度不会流动)。
  • @duncster94 哦,现在我明白你的意思了。对不起。
猜你喜欢
  • 2021-08-19
  • 2022-08-18
  • 2021-10-11
  • 2020-12-06
  • 2021-04-04
  • 2021-02-07
  • 2020-08-05
  • 2022-10-17
  • 2021-06-17
相关资源
最近更新 更多