pytorch梯度/导数/沿轴的差异像numpy.diff

时间:2018-09-13 03:35:16

标签: python numpy pytorch

我一直为此苦苦挣扎。我想要的只是一个torch.diff()函数。但是,许多矩阵运算似乎与张量运算不容易兼容。

我尝试了大量的各种pytorch操作组合,但没有一个起作用。

由于pytorch尚未实现此基本功能,因此我首先尝试沿特定轴从元素i+1中减去元素i

但是,您不能简单地按元素进行此操作(由于张量限制),所以我尝试构造另一个张量,其中元素沿一个轴移动:

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]

但是现在我们遇到了另一个问题-索引实际上并不能真正模仿pytorch中的numpy,因此无法使用这样的“类似于列表的” Tensor进行索引。我还尝试使用张量scatter函数

因此,我仍然遇到尝试在pytoch张量上获得渐变的简单问题。

我所有的搜索都导致了pytorchs的“ autograd”功能的出色功能-与该问题无关。

2 个答案:

答案 0 :(得分:2)

具有固定滤波器的一维卷积应该可以解决问题:

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

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

此外,您可能想要更改padding以适合您的特定需求。

答案 1 :(得分:1)

似乎有一个更简单的解决方案(如我所需要的类似),在此引用:https://discuss.pytorch.org/t/equivalent-function-like-numpy-diff-in-pytorch/35327/2

diff = x[1:] - x[:-1]

可以沿着不同的维度进行操作,例如

diff = polygon[:, 1:] - polygon[:, :-1]

我建议编写一个单元测试来验证相同的行为。