PyTorch梯度/导数/沿轴差异类似于numpy.diff。

3

我已经苦苦挣扎了很长一段时间。我想要的只是一个torch.diff()函数。然而,许多矩阵操作似乎不容易与张量操作兼容。

我尝试了大量各种pytorch操作组合,但它们都没有起作用。

由于pytorch没有实现这个基本功能,我开始尝试沿着特定轴从元素i中减去元素i+1

然而,由于张量的限制,你不能简单地对每个元素进行这样的操作,因此我尝试构造另一个张量,其中的元素沿着一个轴移动:

ix_plus_one = [0]+list(range(0,prediction.size(1)-1))
ix_differential_tensor = torch.LongTensor(ix_plus_one)
diff_one_tensor = prediction[:,ix_differential_tensor]

但是我们现在有一个不同的问题——索引并不能真正地模仿 numpy 在 PyTorch 中的功能,因为它所宣传的那样,并且像这样使用“类似列表”的张量无法进行索引。我还尝试使用张量scatter函数。
所以我仍然困在了这个简单的问题上,即如何在一个PyTorch张量上获取梯度。
我所有的搜索都指向了PyTorch的神奇功能“autograd”,但这与这个问题无关。
3个回答

4
一维卷积配合固定滤波器可解决问题:
filter = torch.nn.Conv1d(in_channels=1, out_channels=1, kernel_size=2, stride=1, padding=1, groups=1, bias=False)
kernel = np.array([-1.0, 1.0])
kernel = torch.from_numpy(kernel).view(1,1,2)
filter.weight.data = kernel
filter.weight.requires_grad = False

然后像使用torch.nn中的任何其他层一样使用filter函数。

另外,您可能需要更改padding以适应您的特定需求。


3

1

对于那些在2021年3月之后遇到这个问题的人

从torch 1.8开始,有一个torch.diff函数,它可以像OP期望的那样正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接