2016-04-04 3 views
4

У TensorBoard была функция для построения гистограмм тензоров во время сеанса. Я хочу гистограмму для градиентов во время обучения.TensorBoard: Как построить гистограмму для градиентов?

tf.gradients(yvars,xvars) возвращает список градиентов.

Однако tf.histogram_summary('name',Tensor) принимает только тензоры, а не списки тензоров.

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

for l in xrange(listlength): col_vec = tf.reshape(grads[l],[-1,1]) g = tf.concat(0,[g,col_vec]) grad_hist = tf.histogram_summary("name", g)

Что бы быть лучше, чтобы построить гистограмму для градиента?

Кажется, что это очень важно, поэтому я надеюсь, что TensorFlow будет иметь специальную функцию для этого.

+3

См функцию [optimize_loss] (https://github.com/tensorflow/tensorflow/blob/c936c06a20b867eaa868e9f2c4fb53856391b18f/tensorflow/contrib/layers/python/layers/optimizers.py#L41), который еще предстоит документированы.Либо используйте эту функцию для оптимизации, либо скопируйте ее [реализацию градиентных гистограмм] (https://github.com/tensorflow/tensorflow/blob/c936c06a20b867eaa868e9f2c4fb53856391b18f/tensorflow/contrib/layers/python/layers/optimizers.py#L114). – user728291

+0

Спасибо user728291. Это очень помогло мне –

ответ

3

Следуя предложению от @user728291, мне удалось просмотреть градиенты в тензометрическом шкафу, используя функцию optimize_loss следующим образом. Функция вызова Синтаксис optimize_loss является

optimize_loss(
loss, 
global_step, 
learning_rate, 
optimizer, 
gradient_noise_scale=None, 
gradient_multipliers=None, 
clip_gradients=None, 
learning_rate_decay_fn=None, 
update_ops=None, 
variables=None, 
name=None, 
summaries=None, 
colocate_gradients_with_ops=False, 
increment_global_step=True 
) 

Функция требует global_step и зависит от некоторых других импорта, как показано ниже.

from tensorflow.python.ops import variable_scope 
from tensorflow.python.framework import dtypes 
from tensorflow.python.ops import init_ops 
global_step = variable_scope.get_variable( # this needs to be defined for tf.contrib.layers.optimize_loss() 
     "global_step", [], 
     trainable=False, 
     dtype=dtypes.int64, 
     initializer=init_ops.constant_initializer(0, dtype=dtypes.int64)) 

Затем замените ваш типичный учебная операция

training_operation = optimizer.minimize(loss_operation) 

с

training_operation = tf.contrib.layers.optimize_loss(
     loss_operation, global_step, learning_rate=rate, optimizer='Adam', 
     summaries=["gradients"]) 

Тогда есть слияние заявление для ваших резюме

summary = tf.summary.merge_all() 

Затем в tensorflow сессии на конец каждого r un/epoch:

summary_writer = tf.summary.FileWriter(logdir_run_x, sess.graph) 
summary_str = sess.run(summary, feed_dict=feed_dict) 
summary_writer.add_summary(summary_str, i) 
summary_writer.flush() # evidently this is needed sometimes or scalars will not show up on tensorboard. 

Место, где logdir_run_x - это другой каталог для каждого запуска. Таким образом, когда TensorBoard работает, вы можете посмотреть каждый прогон отдельно. Градиенты будут находиться под вкладкой гистограммы и будут иметь метку OptimizeLoss. Он отобразит все веса, все смещения и параметр beta в качестве гистограмм.

UPDATE: Используя tf slim, есть другой способ, который также работает и, возможно, более чист.

optimizer = tf.train.AdamOptimizer(learning_rate = rate) 
training_operation = slim.learning.create_train_op(loss_operation, optimizer,summarize_gradients=True) 

Устанавливая summarize_gradients=True, который не используется по умолчанию, вы будете затем получить градиент сводки для всех весов. Они будут отображаться в Tensorboard под summarize_grads

0

Другим решением (на основе this quora answer) является доступ к градиентам непосредственно из уже используемого оптимизатора.

optimizer = tf.train.AdamOptimizer(..) 
grads = optimizer.compute_gradients(loss) 
grad_summ_op = tf.summary.merge([tf.summary.histogram("%s-grad" % g[1].name, g[0]) for g in grads]) 
grad_vals = sess.run(fetches=grad_summ_op, feed_dict = feed_dict) 
writer['train'].add_summary(grad_vals) 
Смежные вопросы