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 ?