2016-01-15 5 views
4

В cifar10 например, градиенты потери по отношению к параметрам можно вычислить следующим образом:Как получить градиенты потери относительно активаций в Tensorflow

grads_and_vars = opt.compute_gradients(loss) 
for grad, var in grads_and_vars: 
    # ... 

Есть ли способ, чтобы получить градиенты потери в отношении активации (а не параметры) и смотреть их в Tensorboard?

ответ

4

Вы можете использовать функцию tf.gradients() для вычисления градиента любого скалярного тензора по отношению к любому другому тензора (предполагая, что градиенты определяются для всех OPS между этими двумя тензорами):

activations = ... 
loss = f(..., activations) # `loss` is some function of `activations`. 

grad_wrt_activations, = tf.gradients(loss, [activation]) 

Визуализируя это в TensorBoard сложно, поскольку grad_wrt_activation (обычно) представляет собой тензор с той же формой, что и activation. Добавление tf.histogram_summary() op, вероятно, самый простой способ визуализации

# Adds a histogram of `grad_wrt_activations` to the graph, which will be logged 
# with the other summaries, and shown in TensorBoard. 
tf.histogram_summary("Activation gradient", grad_wrt_activations) 
+0

Да, это именно то, что я хочу. – anders

+0

Граф вычисляет градиенты дважды, когда используются как opt.compute_gradients(), так и tf.gradients()? Есть ли дополнительные вычислительные затраты? – anders

+0

Граф будет содержать две копии узлов, связанных с градиентом, если вы вызываете как 'opt.compute_gradients()', так и 'tf.gradients()', но сервер должен удалять эти узлы во время исключения общего подвыражения (если нет, это будет ошибкой). – mrry