Я пытаюсь вычислить локальную карту дисперсии изображения, беря данные из всех возможных окон фиксированного размера (например, 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
. Кто-нибудь имеет представление о том, как правильно реализовать локальную карту дисперсии, которая может быть использована в цикле обучения? Решение проблемы градиента также помогло бы мне решить еще одну проблему.