Tensorflow - Доступ к весам при выполнении backprop

1

Я хочу реализовать C-MWP, как описано здесь: https://arxiv.org/pdf/1608.00507.pdf в keras/tensorflow. Это включает в себя изменение способа выполнения backprop. Новый градиент - это функция от нижних реакций активации параметров веса и градиентов слоя выше.

В начале я смотрел, как keras-vis делает модифицированный backprop:

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 мне нужен доступ к весам слоя, на котором выполняется backprop. Можно ли получить доступ к весу в функции @tf.RegisterGradient(name)? Или я ошибаюсь?

Теги:
tensorflow
keras
backpropagation

1 ответ

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]
    ...

Вы должны понимать, что это решение очень хаки. Если вы контролируете передний проход, вы можете просто определить собственный градиент только для интересующего вас подграфа. Вы можете увидеть, как это сделать в том, как зарегистрировать собственный градиент для операции, состоящей из операций tf, и как определить только градиент для подграфа Tensorflow? и https://www.tensorflow.org/api_docs/python/tf/Graph#gradient_override_map

Ещё вопросы

Сообщество Overcoder
Наверх
Меню