我正在尝试使用稀疏滤波器矩阵在 pytorch 中对密集输入执行空间卷积(例如在图像上)。
稀疏张量在 PyTorch 中实现。我尝试使用稀疏张量,但最终出现了段错误。
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)
任何人都可以给我提示如何做到这一点吗?
提前致谢! 戴马特
最佳答案
我知道这个问题已经过时了,但我也知道仍然有人在寻找答案(比如我自己),所以这里...
关于稀疏过滤器
如果您想要稀疏卷积而无法自己指定稀疏模式,请查看 dilated conv (也称为空洞转换)。这是在 PyTorch 中实现的,您可以通过调整 Conv2d 中的 dilation
参数来控制稀疏程度。
如果您想自己指定稀疏模式,据我所知,此功能目前在 PyTorch 中不可用。但您可能想检查this看看你是否可以使用 Tensorflow。还有一个blog post提供有关此存储库的更多详细信息。
稀疏输入
现有和 TODO 稀疏张量操作的列表可用 here .
This讨论 PyTorch 中稀疏张量的当前状态。
This让您可以向 PyTorch 贡献者提出自己的稀疏张量用例。
但在撰写本文时,我没有看到稀疏张量上的卷积成为已实现的功能或出现在 TODO 列表中。不过,稀疏输入上的 nn.Linear
是受支持的。
如果您构建一个稀疏张量并向其应用一个卷积层,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.])
关于sparse-matrix - 使用稀疏滤波器的 PyTorch 2d 卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47890312/