Как включить градиентный поток в scatter_update? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь вычислить локальную карту дисперсии изображения, беря данные из всех возможных окон фиксированного размера (например, 5x5) внутри цикла обучения. Чтобы векторизовать эту операцию, я думаю о расширении исходного изображения с помощью операции, аналогичной this с использованием scatter_update/scatter_nd_update внутри цикла обучения. По сути, эта операция состоит в том, чтобы сопоставить каждый элемент в исходном тензоре с потенциально многими местоположениями в новом тензоре, а местоположения вычисляются внутри цикла обучения.

Однако scatter_update не разрешает распространение градиента, и моя попытка создать простой пользовательский градиент для scatter_update не сработала.

@tf.RegisterGradient("CustomGrad")
def _clip_grad(unused_op, grad):
  return tf.constant(5., dtype=tf.float32, shape=(1)) # tf.clip_by_value(grad, -0.1, 0.1)

x = tf.Variable([3.0], dtype=tf.float32)
y = tf.get_variable('y', shape=(1), dtype=tf.float32)

g = tf.get_default_graph()
with g.gradient_override_map({"ScatterNdUpdate1": "CustomGrad"}):
    output = tf.scatter_nd_update(y, [[0]], x, name="ScatterNdUpdate1")
grad_custom = tf.gradients(output, y)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(grad_custom)

Выполнение кода выше показывает, что grad_custom содержит None. Кто-нибудь имеет представление о том, как правильно реализовать локальную карту дисперсии, которая может быть использована в цикле обучения? Решение проблемы градиента также помогло бы мне решить еще одну проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...