PyTorch 2d使用稀疏滤波器进行卷积

时间:2017-12-19 15:34:24

标签: sparse-matrix convolution pytorch

我正在尝试使用稀疏滤波器矩阵在密集输入的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

2 个答案:

答案 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/