Как я могу использовать Tensorflows scatter_nd с кусочками? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь оптимизировать только части переменной. Я нашел этот , казалось бы, полезный ответ.

Однако моя переменная - это изображение, и я хочу изменить только его части, поэтому я пытаюсь расширить код для большего количества измерений. Кажется, это работает нормально:

import tensorflow as tf
import tensorflow.contrib.opt as opt

X = tf.Variable([[1.0, 2.0], [3.0, 4.0]])

# the next two lines need to change because
# manually specifying the values is not feasible
indexes = tf.constant([[0, 0], [1, 0]])
updates = [X[0, 0], X[1, 0]]

part_X = tf.scatter_nd(indexes, updates, [2, 2])
X_2 = part_X + tf.stop_gradient(-part_X + X)
Y = tf.constant([[2.5, -3.5], [5.5, -7.5]])
loss = tf.reduce_sum(tf.squared_difference(X_2, Y))
opt = opt.ScipyOptimizerInterface(loss, [X])

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    opt.minimize(sess)
    print("X: {}".format(X.eval()))

Однако, поскольку размеры моего изображения и область, которую я хотел бы выбрать, намного больше, указание всех индексов вручную невозможно. Я хотел бы знать, как использовать для этого фрагменты или диапазоны.

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете сделать это так:

import tensorflow as tf

# Input with size (50, 100)
X = tf.Variable([[0] * 100] * 50)
# Selected slice
row_start = 10
row_end = 30
col_start = 20
col_end = 50
# Make indices from meshgrid
indexes = tf.meshgrid(tf.range(row_start, row_end),
                      tf.range(col_start, col_end), indexing='ij')
indexes = tf.stack(indexes, axis=-1)
# Take slice
updates = X[row_start:row_end, col_start:col_end]
# Build tensor with "filtered" gradient
part_X = tf.scatter_nd(indexes, updates, tf.shape(X))
X_2 = part_X + tf.stop_gradient(-part_X + X)
# Continue as before...
...