TensorFlow-如何在忽略零权重的同时计算梯度?

时间:2018-12-20 05:05:52

标签: python tensorflow optimization deep-learning

我想通过将一些权重设置为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将具有一些与权重为零的索引相对应的渐变。应用蒙版“浪费”了那些本应用于更新非零权重的渐变。

我希望它基于非零权重来计算损失。

有什么想法吗?

0 个答案:

没有答案