为了账号安全,请及时绑定邮箱和手机立即绑定

没有所有连接的神经网络层

没有所有连接的神经网络层

大话西游666 2023-08-08 10:55:08
神经网络密集层中的权重是一个 (n,d) 矩阵,我想强制其中一些权重始终为零。我有另一个 (n,d) 矩阵,它是其条目可以非零的掩码。这个想法是,该层不应该是真正密集的,而是缺少一些连接(即等于 0)。在使用 PyTorch(或 Tensorflow)训练时如何实现这一目标?我不希望这些权重在训练时变得非零。一种方法(如果不直接支持)是在每次训练迭代后将所需的条目清零。
查看完整描述

2 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

您可以利用 pytorch 的稀疏数据类型:


class SparseLinear(nn.Module):

  def __init__(self, in_features, out_features, sparse_indices):

    super(SparseLinear, self).__init__()

    self.weight = nn.Parameter(data=torch.sparse.FloatTensor(sparse_indices, torch.randn(sparse_indices.shape[1]), [in_features, out_features]), requires_grad=True)

    self.bias = nn.Parameter(data=torch.randn(out_features), requires_grad=True)


  def forward(self, x):

    return torch.sparse.admm(self.bias, self.weight, x, 1., 1.)


查看完整回答
反对 回复 2023-08-08
?
HUX布斯

TA贡献1876条经验 获得超6个赞

我假设您想使用密集张量来实现这种稀疏连接层。如果是这样,您可以将要屏蔽(无连接)的元素的屏蔽矩阵(张量)定义为 0.0,否则为 1.0。在前向传递中,您可以简单地将权重张量与掩码张量相乘(您想要采用逐元素乘积,这是您在 PyTorch 中使用 * 运算符时的默认值),然后再与输入进行矩阵乘法对于你的稀疏层。

为了使其正常工作,您必须确保您的掩模张量没有收到梯度,否则它会在您训练模型时更新并变得无效。为此,您只需requires_grad=False在创建掩模张量时进行设置。


查看完整回答
反对 回复 2023-08-08
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信