Предположим, что у меня есть следующая функция потерь:
loss_a = tf.reduce_mean(my_loss_fn(model_output, targets))
loss_b = tf.reduce_mean(my_other_loss_fn(model_output, targets))
loss_final = loss_a + tf.multiply(alpha, loss_b)
Чтобы визуализировать норму градиентов w.r.t до loss_final
, можно было бы сделать это:
optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
grads_and_vars = optimizer.compute_gradients(loss_final)
grads, _ = list(zip(*grads_and_vars))
norms = tf.global_norm(grads)
gradnorm_s = tf.summary.scalar('gradient norm', norms)
train_op = optimizer.apply_gradients(grads_and_vars, name='train_op')
Однако мне хотелось бы построить график градиентов w.r.t до loss_a
и loss_b
отдельно. Как я могу сделать это наиболее эффективным способом? Должен ли я называть compute_gradients(..)
на loss_a
и loss_b
отдельно, а затем добавлять эти два градиента вместе, прежде чем передавать их в optimizer.apply_gradients(..)
? Я знаю, что это математически было бы правильным из-за правила суммирования, но это кажется немного громоздким, и я также не знаю, как правильно реализовать суммирование градиентов. Кроме того, loss_final
довольно прост, потому что это просто суммирование. Что, если loss_final
было более сложным, например. деление?
Я использую Tensorflow 0.12.