6 votes

Comment imprimer les gradients pendant la formation dans Tensorflow ?

Afin de déboguer un modèle Tensorflow, j'ai besoin de voir si les gradients sont modifiés ou s'il y a des nœuds dans ceux-ci. La simple impression d'une variable dans Tensorflow ne fonctionne pas car tout ce que vous voyez est :

 <tf.Variable 'Model/embedding:0' shape=(8182, 100) dtype=float32_ref>

J'ai essayé d'utiliser tf.Print mais je n'arrive pas à la faire fonctionner et je me demande si elle peut réellement être utilisée de cette façon. Dans mon modèle, j'ai une boucle d'apprentissage qui imprime les valeurs de perte de chaque époque :

def run_epoch(session, model, eval_op=None, verbose=False):
    costs = 0.0
    iters = 0
    state = session.run(model.initial_state)
    fetches = {
            "cost": model.cost,
            "final_state": model.final_state,
    }
    if eval_op is not None:
        fetches["eval_op"] = eval_op

    for step in range(model.input.epoch_size):
        feed_dict = {}
        for i, (c, h) in enumerate(model.initial_state):
            feed_dict[c] = state[i].c
            feed_dict[h] = state[i].h

        vals = session.run(fetches, feed_dict)
        cost = vals["cost"]
        state = vals["final_state"]

        costs += cost
        iters += model.input.num_steps

    print("Loss:", costs)

    return costs

Insertion de print(model.gradients[0][1]) dans cette fonction ne fonctionne pas, j'ai donc essayé d'utiliser le code suivant juste après l'impression des pertes :

grads = model.gradients[0][1]
x = tf.Print(grads, [grads])
session.run(x)

Mais j'ai reçu le message d'erreur suivant :

ValueError: Fetch argument <tf.Tensor 'mul:0' shape=(8182, 100) dtype=float32> cannot be interpreted as a Tensor. (Tensor Tensor("mul:0", shape=(8182, 100), dtype=float32) is not an element of this graph.)

Ce qui est logique car tf.Print ne fait en effet pas partie du graphe. J'ai donc essayé d'utiliser tf.Print après le calcul des pertes dans le graphique actuel, mais cela n'a pas fonctionné aussi bien et j'ai toujours obtenu Tensor("Train/Model/mul:0", shape=(8182, 100), dtype=float32) .

Comment puis-je imprimer la variable des gradients à l'intérieur de la boucle d'apprentissage dans Tensorflow ?

8voto

Maxim Points 28843

D'après mon expérience, la meilleure façon de voir le flux de gradient dans tensorflow n'est pas avec tf.Print mais avec tensorboard. Voici un exemple de code que j'ai utilisé dans un autre problème où les gradients étaient la question clé de l'apprentissage :

for g, v in grads_and_vars:
  tf.summary.histogram(v.name, v)
  tf.summary.histogram(v.name + '_grad', g)

merged = tf.summary.merge_all()
writer = tf.summary.FileWriter('train_log_layer', tf.get_default_graph())

...

_, summary = sess.run([train_op, merged], feed_dict={I: 2*np.random.rand(1, 1)-1})
if i % 10 == 0:
  writer.add_summary(summary, global_step=i)

Cela vous présentera le distribution de gradients dans le temps. Au fait, pour vérifier les NaN, il y a une fonction dédiée dans tensorflow : tf.is_nan . En général, il n'est pas nécessaire de vérifier si le gradient est NaN : lorsque cela se produit, la variable explose également et cela sera clairement visible dans le tensorboard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X