我想知道TensorFlow,PyTorch或其他库中是否有一种方法可以选择性地连接神经元。我想建立一个在每一层中都有大量神经元的网络,但是层之间的连接很少。
请注意,我不认为这是此答案的重复:Selectively zero weights in TensorFlow?。我使用了与该问题中出现的方法基本相同的方法来实现自定义keras层-基本上是通过创建一个密集层,在该层中除指定权重之外的所有权重在训练和评估中均被忽略。通过不训练指定的权重并且不将其用于预测,这满足了我想做的部分工作。但是,问题在于我仍然浪费内存来保存未训练的权重,并且浪费时间来计算归零权重的梯度。我想要的是梯度矩阵的计算仅涉及稀疏矩阵,这样我就不会浪费时间和内存。
有没有一种方法可以选择性地创建和训练权重而不浪费内存?如果我的问题不清楚,或者有更多信息对我有帮助,请告诉我。作为提问者,我希望对您有所帮助。
答案 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.sparse,tf.sparse)。
我的直觉理解是,如果您愿意使用相应的低级API来编写网络(例如,实际自己实现前向传递),则可以将权重矩阵转换为稀疏张量。这又将导致连接稀疏,因为层[L]的权重矩阵定义了先前层[L-1]的神经元与层[L]的神经元之间的连接。