我想将张量初始化为稀疏张量。当张量的维数为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
如果您希望强制按列、通道等方式执行零的比例(而不仅仅是总比例(,则可以实现与原始函数类似的逻辑。