sparse-matrix - 使用稀疏滤波器的 PyTorch 2d 卷积

标签 sparse-matrix convolution pytorch

我正在尝试使用稀疏滤波器矩阵在 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/

相关文章:

python - Keras 与 Caffe 中的卷积有什么区别?

c++ - 用于各种 b 的稀疏带状 Ax=b 的批量 CUDA 解决方案

python - 如何使用 scipy 对图像进行卷积

deep-learning - Keras:扩大层输出 blob 空间维度的方法

python - pytorch : unable to understand model. 转发功能

python - 将 L1 损失稍微适应 Pytorch 中的加权 L1 损失,梯度计算是否仍能正常工作?

python - numpy.array 中的零条目是否占用内存?

c++ - 连接稀疏矩阵特征

OpenCL 矩阵向量乘法代码每次运行都会给出正确和错误的解决方案

pytorch - PyTorch中torch.embedding的定义在哪里?