Tensorflow-在进行反向传播时访问权重

时间:2018-08-28 13:14:25

标签: python tensorflow keras backpropagation

我要按以下说明实施C-MWP:https://arxiv.org/pdf/1608.00507.pdf(在keras / tensorflow中)。 这涉及修改反向传播的执行方式。新的梯度是底部激活响应的权重参数和上方层的梯度的函数。

首先,我正在研究keras-vis进行修改后的反向传播的方式:

def _register_guided_gradient(name):
if name not in ops._gradient_registry._registry:
    @tf.RegisterGradient(name)
    def _guided_backprop(op, grad):
        dtype = op.outputs[0].dtype
        gate_g = tf.cast(grad > 0., dtype)
        gate_y = tf.cast(op.outputs[0] > 0, dtype)
        return gate_y * gate_g * grad

但是,要实现C-MWP,我需要访问执行反向传播的层的权重。是否可以在@ tf.RegisterGradient(name)函数中访问权重?还是我走错了路?

1 个答案:

答案 0 :(得分:0)

TF中的梯度计算基本上是按操作进行的。如果要更改权重的梯度的操作是在权重上执行的,或者至少权重在操作图中与权重相距不远,则可以尝试通过在自定义梯度内移动该图来找到权重张量。例如,假设您有类似

x = tf.get_variable(...)
y = 5.0 * x
tf.gradients(y, x)

您可以使用类似

的方法来获取可变张量(更准确地说,是由变量读取操作生成的张量)。
@tf.RegisterGradient(name)
def my_grad(op, grad):
    weights = op.inputs[1]
    ...

如果权重不是立即输入,但您知道如何获得权重,则可以使用类似以下的方法稍微走一下图:

@tf.RegisterGradient(name)
def my_grad(op, grad):
    weights = op.inputs[1].op.inputs[0].op.inputs[2]
    ...

您应该了解,此解决方案非常棘手。如果控制前向通过,则可能只想为您关注的子图定义自定义渐变。您可以在How to register a custom gradient for a operation composed of tf operations中了解如何做到这一点  以及How Can I Define Only the Gradient for a Tensorflow Subgraph?https://www.tensorflow.org/api_docs/python/tf/Graph#gradient_override_map