我有一个张量,看起来像
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
,因为创建新的张量是不可微分的。
任何帮助不胜感激!
我不确定你所说的"可微分"是什么意思,但这里有一种使用高级索引的简单方法。
coords = coords.long()
grid[coords[0],coords[1]] = 1
tensor([[1., 0., 1.],
[0., 0., 1.],
[0., 0., 1.]])
我认为 Torch 没有关于此的详细文档,但numpy
这里有。(可能与火炬非常相似(
这也是可能的
coords = coords.long()
grid[coords[0],coords[1]] = torch.Tensor([1,2,3,4])
tensor([[1., 0., 2.],
[0., 0., 3.],
[0., 0., 4.]])
说
coords = [[0, 0, 1, 2],
[0, 2, 2, 2]]
然后:
torch.stack([torch.stack(x) for x in coords])