TensorBoard: ¿Cómo trazar histogtwig para gradientes?

TensorBoard tenía la función de trazar histogtwigs de tensores en el momento de la sesión. Quiero un histogtwig para los gradientes durante el entrenamiento.

tf.gradients(yvars,xvars) devuelve una lista de gradientes.

Sin embargo, tf.histogram_summary('name',Tensor) solo acepta Tensors, no listas de Tensors.

Por el momento, hice una solución alternativa. Aplané todos los tensores a un vector de columna y los concatené:

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)

¿Cuál sería una mejor manera de trazar el histogtwig para el gradiente?

Parece algo común, así que espero que TensorFlow tenga una función dedicada para esto.

Siguiendo la sugerencia de @ user728291 , pude ver los gradientes en tensorboard utilizando la función Optimize_loss de la siguiente manera. La syntax de llamada de función para optimiza_lustra es

 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 ) 

La función requiere global_step y depende de algunas otras importaciones como se muestra a continuación.

 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)) 

Luego reemplace su operación típica de entrenamiento

 training_operation = optimizer.minimize(loss_operation) 

con

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

Luego tenga una statement de fusión para sus resúmenes

 summary = tf.summary.merge_all() 

Luego, en su sesión de tensorflow al final de cada ejecución / época:

 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. 

Donde logdir_run_x es un directorio diferente para cada ejecución. De esa manera, cuando se ejecuta TensorBoard, puede ver cada ejecución por separado. Los gradientes estarán debajo de la pestaña de histogtwig y tendrán la etiqueta OptimizeLoss . Mostrará todos los pesos, todos los sesgos y el parámetro beta como histogtwigs.

ACTUALIZACIÓN: Al usar tf slim, hay otra manera que también funciona y es quizás más limpia.

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

Al establecer summarize_gradients=True , que no es el valor predeterminado, obtendrá resúmenes de gradiente para todos los pesos. Éstos se podrán ver en Tensorboard en summaryize_grads

Otra solución (basada en esta respuesta de quora ) es acceder a los gradientes directamente desde el optimizador que ya está utilizando.

 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)