我想通过将一些权重设置为 0.0(每层中的特定权重,以此处讨论不重要的方式选择)来实现剪枝,以(1)在推理过程中忽略它们,(2)在训练过程中忽略它们。
我知道我可以在推理过程中忽略它们,方法是对每一层应用一个掩码,其中 1 位于我想要保留的权重索引处,否则为零。
然而,在训练过程中,我希望忽略的权重继续被忽略。也就是说,我希望它们(1)不更新并且(2)不影响其余梯度的计算。
我可以通过在应用渐变之前屏蔽渐变来做到(1)。但我做不到(2)。
我尝试过这样的事情:
# Create an optimizer.
opt = GradientDescentOptimizer(learning_rate=0.1)
# Compute the gradients for a list of variables.
# This returns a list of tuples, each tuple containing gradients and
# the corresponding variable
[(var, grad)] = opt.compute_gradients(loss)
# Ask the optimizer to apply the capped gradients.
train_op = optimizer.apply_gradients([(grad * mask, var)])
但这并不能达到我的目的,因为optimizer.compute_gradients(loss)
会计算损失基于所有权重,包括零权重。换句话说,grad
将具有一些对应于权重为零的索引的梯度。应用掩模会“浪费”这些本应用于更新非零权重的梯度。
我希望它根据非零权重计算损失。
有任何想法吗?
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)