我已经为此苦苦挣扎了很长一段时间。我想要的只是一个 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]
但现在我们有一个不同的问题 - 索引并不像它宣传的那样真的模仿 pytorch 中的 numpy,所以你不能用这样的“类列表”张量进行索引。我还尝试使用张量 scatter 函数
所以我仍然坚持尝试在 pytoch 张量上获得梯度这个简单的问题。
我所有的搜索都导致了 pytorchs 的“autograd”功能的惊人功能——这与这个问题无关。
请您参考如下方法:
具有固定过滤器的一维卷积应该可以解决问题:
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 以满足您的特定需求。
