在TensorFlow或PyTorch中仅创建和训练指定的权重

时间:2018-10-18 02:22:46

标签: python tensorflow neural-network keras pytorch

我想知道TensorFlow,PyTorch或其他库中是否有一种方法可以选择性地连接神经元。我想建立一个在每一层中都有大量神经元的网络,但是层之间的连接很少。

请注意,我不认为这是此答案的重复:Selectively zero weights in TensorFlow?。我使用了与该问题中出现的方法基本相同的方法来实现自定义keras层-基本上是通过创建一个密集层,在该层中除指定权重之外的所有权重在训练和评估中均被忽略。通过不训练指定的权重并且不将其用于预测,这满足了我想做的部分工作。但是,问题在于我仍然浪费内存来保存未训练的权重,并且浪费时间来计算归零权重的梯度。我想要的是梯度矩阵的计算仅涉及稀疏矩阵,这样我就不会浪费时间和内存。

有没有一种方法可以选择性地创建和训练权重而不浪费内存?如果我的问题不清楚,或者有更多信息对我有帮助,请告诉我。作为提问者,我希望对您有所帮助。

2 个答案:

答案 0 :(得分:1)

通常的简单解决方案是将您的权重矩阵初始化为零,而该零点应该没有连接。您存储这些零的位置的掩码,并在每次权重更新后将这些位置的权重设置为零。您需要执行此操作,因为零权重的梯度可能不为零,这会在您不需要的地方引入非零权重(即connectios)。

伪代码:

# setup network
weights = sparse_init()  # only nonzero for existing connections
zero_mask = where(weights == 0)

# train
for e in range(num_epochs):
    train_operation()  # may lead to introduction of new connections
    weights[zero_mask] = 0  # so we set them to zero again

答案 1 :(得分:0)

tensorflow和pytorch都支持稀疏张量(torch.sparsetf.sparse)。

我的直觉理解是,如果您愿意使用相应的低级API来编写网络(例如,实际自己实现前向传递),则可以将权重矩阵转换为稀疏张量。这又将导致连接稀疏,因为层[L]的权重矩阵定义了先前层[L-1]的神经元与层[L]的神经元之间的连接。