Lors de l'utilisation d'une fonction personnalisée pour la fonction de perte pendant l'entraînement ou la partie de conversion de l'ensemble de données dans TensorFlow (2.x), j'ai essayé de confirmer "La valeur est-elle conforme aux attentes?" L'appel) peut ne pas afficher la valeur. Vous pouvez utiliser un débogueur tel que
tfdbg``, mais voici un moyen plus simple de faire ce que l'on appelle le "débogage d'impression".
Pour tfdbg
→ Utilisez tfdbg pour écraser Keras nan et inf --Qiita
Dans le code ci-dessous, on suppose que ↓ est écrit.
import tensorflow as tf
Eager Execution est maintenant la valeur par défaut dans TensorFlow 2.x, donc tant que vous assemblez Tensor
avec l'interpréteur, vous pouvez simplement faire print () '' pour voir la valeur de
Tensor. Vous pouvez également obtenir la valeur
ndarrayavec
.numpy () ''
x = tf.constant(10)
y = tf.constant(20)
z = x + y
print(z) # tf.Tensor(30, shape=(), dtype=int32)
print(z.numpy()) # 30
Comme l'évaluation séquentielle de la valeur de Tensor '' est lente au moment de l'apprentissage / évaluation, il est possible de définir la fonction à traiter en mode graphique en ajoutant le décorateur
@ tf.function ''. ** Les opérations définies en mode graphique sont traitées ensemble comme un graphique de calcul (en dehors de Python), vous ne pouvez donc pas voir les valeurs dans le processus de calcul. ** **
@tf.function
def dot(x, y):
tmp = x * y
print(tmp)
return tf.reduce_sum(tmp)
x = tf.constant([1, 2])
y = tf.constant([3, 1])
w = tf.constant([0, 2])
print(dot(x, y))
print(dot(x, w))
# Tensor("mul:0", shape=(2,), dtype=int32)
# tf.Tensor(5, shape=(), dtype=int32)
# tf.Tensor(4, shape=(), dtype=int32)
Vous pouvez sortir le résultat du calcul en dehors de dot () '', mais vous ne pouvez pas voir la valeur à l'intérieur. De plus, même si vous appelez
dot () '' plusieurs fois, le `` print () '' à l'intérieur n'est fondamentalement exécuté qu'une seule fois au moment de l'analyse du graphique.
Bien sûr, dans ce cas, vous pouvez supprimer le `` @ tf.function () '' pour voir la valeur.
def dot(x, y):
tmp = x * y
print(tmp)
return tf.reduce_sum(tmp)
x = tf.constant([1, 2])
y = tf.constant([3, 1])
w = tf.constant([0, 2])
print(dot(x, y))
print(dot(x, w))
# tf.Tensor([3 2], shape=(2,), dtype=int32)
# tf.Tensor(5, shape=(), dtype=int32)
# tf.Tensor([0 4], shape=(2,), dtype=int32)
# tf.Tensor(4, shape=(), dtype=int32)
Il peut être implicitement exécuté en mode graphique, comme lors du traitement de map () '' pour
tf.data.Datasetou lors de l'utilisation de votre propre fonction de perte dans Keras. Dans ce cas, vous ne pouvez pas voir la valeur au milieu avec
print () '' même si ** @ tf.function
n'est pas ajouté. ** **
def fourth_power(x):
z = x * x
print(z)
z = z * z
return z
ds = tf.data.Dataset.range(10).map(fourth_power)
for i in ds:
print(i)
# Tensor("mul:0", shape=(), dtype=int64)
# tf.Tensor(0, shape=(), dtype=int64)
# tf.Tensor(1, shape=(), dtype=int64)
# tf.Tensor(16, shape=(), dtype=int64)
# :
tf.print()
Utilisez tf.print () '' pour voir la valeur de
Tensor '' dans le processus s'exécutant en mode graphique.
tf.print | TensorFlow Core v2.1.0
Vous pouvez afficher les valeurs comme suit, ou vous pouvez utiliser tf.shape () '' pour afficher les dimensions et la taille de
Tensor ''. Veuillez également l'utiliser pour le débogage lorsque vous vous mettez en colère lorsque les dimensions et les tailles ne correspondent pas pour une raison quelconque dans votre propre fonction.
@tf.function
def dot(x, y):
tmp = x * y
tf.print(tmp)
tf.print(tf.shape(tmp))
return tf.reduce_sum(tmp)
x = tf.constant([1, 2])
y = tf.constant([3, 1])
w = tf.constant([0, 2])
print(dot(x, y))
print(dot(x, w))
# [3 2]
# [2]
# tf.Tensor(5, shape=(), dtype=int32)
# [0 4]
# [2]
# tf.Tensor(4, shape=(), dtype=int32)
Si vous souhaitez déboguer Dataset.map () '', vous pouvez utiliser
tf.print () ''.
def fourth_power(x):
z = x * x
tf.print(z)
z = z * z
return z
ds = tf.data.Dataset.range(10).map(fourth_power)
for i in ds:
print(i)
# 0
# tf.Tensor(0, shape=(), dtype=int64)
# 1
# tf.Tensor(1, shape=(), dtype=int64)
# 4
# tf.Tensor(16, shape=(), dtype=int64)
# :
Ensuite, si vous ne pensez à rien et que vous devez sortir le contenu de Tensor
avec tf.print () '', ce n'est pas le cas.
tf.print () '' est exécuté lorsque le processus est réellement exécuté comme un graphe calculé.
En d'autres termes, si vous constatez que les types et dimensions ne correspondent pas au moment de l'analyse du graphe sans effectuer ** de calcul et qu'une erreur se produit, le traitement de `` tf.print () '' ne sera pas exécuté. ** C'est compliqué ...
@tf.function
def add(x, y):
z = x + y
tf.print(z) #Cette impression ne sera pas exécutée
return z
x = tf.constant([1, 2])
y = tf.constant([3, 4, 5])
ret = add(x, y)
# ValueError: Dimensions must be equal, but are 2 and 3 for 'add' (op: 'AddV2') with input shapes: [2], [3].
Dans un tel cas, il est préférable d'utiliser `` print () '' ordinaire pour vérifier si les données de la forme souhaitée sont transmises.
@tf.function
def add(x, y):
print(x) #Cette impression est exécutée lors de l'analyse du graphe de calcul
print(y)
z = x + y
return z
x = tf.constant([1, 2])
y = tf.constant([3, 4, 5])
ret = add(x, y)
# Tensor("x:0", shape=(2,), dtype=int32)
# Tensor("y:0", shape=(3,), dtype=int32)
# ValueError: Dimensions must be equal, but are 2 and 3 for 'add' (op: 'AddV2') with input shapes: [2], [3].
Par exemple, pensez à compter le nombre de fois que votre propre fonction a été appelée en mode graphique et à afficher le nombre d'appels.
count = 0
@tf.function
def dot(x, y):
global count
tmp = x * y
count += 1
tf.print(count, tmp)
return tf.reduce_sum(tmp)
x = tf.constant([1, 2])
y = tf.constant([3, 1])
w = tf.constant([0, 2])
print(dot(x, y))
print(dot(x, w))
# 1 [3 2]
# tf.Tensor(5, shape=(), dtype=int32)
# 1 [0 4]
# tf.Tensor(4, shape=(), dtype=int32)
"1" sera également affiché la deuxième fois. En effet, `` count + = 1 '' en tant que code Python n'est exécuté qu'une seule fois lors de l'analyse du graphique.
La bonne réponse est d'utiliser tf.Variable ()
et ```assign_add () `` comme indiqué ci-dessous.
tf.Variable | TensorFlow Core v2.1.0
count = tf.Variable(0)
@tf.function
def dot(x, y):
tmp = x * y
count.assign_add(1)
tf.print(count, tmp)
return tf.reduce_sum(tmp)
x = tf.constant([1, 2])
y = tf.constant([3, 1])
w = tf.constant([0, 2])
print(dot(x, y))
print(dot(x, w))
# 1 [3 2]
# tf.Tensor(5, shape=(), dtype=int32)
# 2 [0 4]
# tf.Tensor(4, shape=(), dtype=int32)
Amélioration des performances avec tf.function | TensorFlow Core (Document officiel)
Recommended Posts