我想通过将一些权重设置为0.0(每层中的特定权重,以在这里不讨论的方式选择特定权重)来实现修剪,以(1)在推理过程中忽略它们,(2)在训练过程中忽略它们。
我知道我可以通过在每个图层上应用一个蒙版来忽略它们,在我要保留的权重索引处添加一个蒙版,否则将其设置为零。
但是,在培训期间,我希望忽略的权重保持忽略。也就是说,我希望它们(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
将具有一些与权重为零的索引相对应的渐变。应用蒙版“浪费”了那些本应用于更新非零权重的渐变。
我希望它基于非零权重来计算损失。
有什么想法吗?