Как рассчитываются градиенты для DeepDream

У меня есть очень простая реализация алгоритма Deep Dream, вдохновленная примером kadenze https://github.com/pkmital/CADL/blob/master/session-4/lecture-4.ipynb:

layer = graph.get_tensor_by_name('inception/output2:0')
layer_size = layer.eval({x: img_4d}).shape

neuron_i = 110

layer_activation = np.zeros(layer_size)
layer_activation[..., neuron_i] = 1

grad = tf.gradients(layer[..., neuron_i], x)[0]

img_noise_4d = img_noise.copy()[np.newaxis]
img_noise_4d /=  255.0

grad_step = 4.0
n_steps = 100
for step in range(n_steps):
    print(step, end=', ')
    res = grad.eval({layer: layer_activation, x: img_noise_4d})
    res /= (np.max(np.abs(res)) + 1e-8)
    img_noise_4d += res * grad_step

plt.imshow(normalize(img_noise_4d[0]))

Я не могу понять, как это работает - я имею в виду, как мы можем заменить фактическую активацию слоя на тот, который мы создали (layer_activation) и получить правильный градиент?

Я сделал простой эксперимент:

x = tf.Variable(3.0)
y = x**2

session = tf.InteractiveSession()
session.run(tf.global_variables_initializer())

session.run(tf.gradients(y, x)[0], {y: 100})

Все, что я заменяю как y - Я всегда получаю правильный градиент для x в точке 3.0 который 6.0, Я понимаю, что мне чего-то не хватает, но что именно?

1 ответ

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

Этот ответ лучше показывает, как это работает:

x = tf.Variable(3.0)
w = tf.Variable([6.0, 2.0])
y = x * w

session = tf.InteractiveSession()
session.run(tf.global_variables_initializer())

session.run(
    tf.gradients(tf.reduce_max(y), x)[0], 
    {y: [3, 9],
})

Так что в основном, передавая обычай y в session.run мы можем предложить поддержать алгоритм распространения, какой "нейрон" мы ожидаем получить максимальным - и, таким образом, он будет вычислять градиент, а не фактический (y[0]), но на заказ (y[1]).

Мы можем сделать еще проще, если знаем, какой именно нейрон нас интересует:

session.run(
    tf.gradients(y[1], x)[0], 
)
Другие вопросы по тегам