我正在尝试使用稀疏滤波器矩阵在密集输入的pytorch中执行空间卷积(例如在图像上)。
稀疏张量在PyTorch中实现。我试图使用稀疏Tensor,但最终会出现分段错误。
import torch
from torch.autograd import Variable
from torch.nn import functional as F
# build sparse filter matrix
i = torch.LongTensor([[0, 1, 1],[2, 0, 2]])
v = torch.FloatTensor([3, 4, 5])
filter = Variable(torch.sparse.FloatTensor(i, v, torch.Size([3,3])))
inputs = Variable(torch.randn(1,1,6,6))
F.conv2d(inputs, filter)
任何人都可以给我一个如何做到这一点的提示吗?
提前致谢! dymat
答案 0 :(得分:0)
我知道这个问题已经过时了,但是我也知道仍然有人在寻找答案(例如我自己),所以这里...
在稀疏过滤器上
如果您想要稀疏卷积而没有自由指定稀疏模式,请查看dilated conv(也称为atrous conv)。这是在PyTorch中实现的,您可以通过在Conv2d中调整dilation
参数来控制稀疏程度。
据我所知,如果您想自行指定稀疏模式,则PyTorch当前不提供此功能。但是,如果可以使用Tensorflow,您可能需要检查this。还有一个blog post提供了有关此存储库的更多详细信息。
稀疏输入
here列出了现有的和TODO稀疏张量操作。
This讨论了PyTorch中稀疏张量的当前状态。
This可让您向PyTorch贡献者提出自己的稀疏张量用例。
但是在撰写本文时,我还没有看到稀疏张量的转换是已实现的功能或在TODO列表中。但是,支持稀疏输入的nn.Linear
。
如果您构建一个稀疏张量并对其应用一个conv层,则PyTorch(1.1.0)会引发异常:
>>> a = torch.zeros((1, 3, 2, 2), layout=torch.sparse_coo)
>>> net = torch.nn.Conv2d(1, 1, 1)
>>> b = net(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/torch/nn/modules/module.py", line 493, in __call__
result = self.forward(*input, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/torch/nn/modules/conv.py", line 338, in forward
self.padding, self.dilation, self.groups)
RuntimeError: sparse tensors do not have is_contiguous
>>> torch.__version__
'1.1.0'
更改为线性图层即可使用:
>>> c = torch.zeros((1, 2), layout=torch.sparse_coo)
>>> another_net = torch.nn.Linear(2, 1)
>>> d = another_net(c)
>>> d
tensor([[0.1944]], grad_fn=<AddmmBackward>)
>>> d.backward()
>>> another_net.weight.grad
tensor([[0., 0.]])
>>> another_net.bias.grad
tensor([1.])
答案 1 :(得分:0)
这些家伙做了类似稀疏的conv2d-https://github.com/numenta/nupic.torch/