如何创建n维稀疏张量?(pytorch)



我想将张量初始化为稀疏张量。当张量的维数为2时,我可以使用torch.nn.init.sparse(tensor, sparsity=0.1)

import torch
dim = torch.Size([3,2])
w = torch.Tensor(dim)
torch.nn.init.sparse_(w, sparsity=0.1)

结果

tensor([[ 0.0000,  0.0147],
[-0.0190,  0.0004],
[-0.0004,  0.0000]])

但是当张量维数>2,这个功能不起作用。

v = torch.Tensor(torch.Size([5,5,30,2]))
torch.nn.init.sparse_(v, sparsity=0.1)

结果

ValueError: Only tensors with 2 dimensions are supported

我需要这个,因为我想用它来初始化卷积权重。

torch.nn.init.sparse_()函数的def低于

def sparse_(tensor, sparsity, std=0.01):
r"""Fills the 2D input `Tensor` as a sparse matrix, where the
non-zero elements will be drawn from the normal distribution
:math:`mathcal{N}(0, 0.01)`, as described in `Deep learning via
Hessian-free optimization` - Martens, J. (2010).
Args:
tensor: an n-dimensional `torch.Tensor`
sparsity: The fraction of elements in each column to be set to zero
std: the standard deviation of the normal distribution used to generate
the non-zero values
Examples:
>>> w = torch.empty(3, 5)
>>> nn.init.sparse_(w, sparsity=0.1)
"""
if tensor.ndimension() != 2:
raise ValueError("Only tensors with 2 dimensions are supported")
rows, cols = tensor.shape
num_zeros = int(math.ceil(sparsity * rows))
with torch.no_grad():
tensor.normal_(0, std)
for col_idx in range(cols):
row_indices = torch.randperm(rows)
zero_indices = row_indices[:num_zeros]
tensor[zero_indices, col_idx] = 0
return tensor

如何制作n维稀疏张量?

pytorch中有没有一种方法可以创建这种张量?

或者我可以换一种方式吗?

此函数是以下方法的实现:

我们发现的最好的随机初始化方案是我们自己设计的方案之一;稀疏初始化";。在这个方案中,我们严格限制每个的非零传入连接权重的数量单位(我们在实验中使用了15(,并将偏差设置为0(对于tanh单位为0.5(。

  • 通过Hessian免费优化的深度学习-Martens,J.(2010(

高阶张量不支持它的原因是,它在每列中保持相同的零比例,并且不清楚高阶张量应该在哪个维度上保持这种条件。

您可以使用dropout或等效功能来实现此初始化策略,例如:

def sparse_(tensor, sparsity, std=0.01):
with torch.no_grad():
tensor.normal_(0, std)
tensor = F.dropout(tensor, sparsity)
return tensor

如果您希望强制按列、通道等方式执行零的比例(而不仅仅是总比例(,则可以实现与原始函数类似的逻辑。

相关内容

  • 没有找到相关文章

最新更新