我一直为此苦苦挣扎。我想要的只是一个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”功能的出色功能-与该问题无关。
答案 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]
我建议编写一个单元测试来验证相同的行为。