Bei Verwendung einer selbst erstellten Funktion für die Verlustfunktion während des Trainings oder des Konvertierungsteils des Datensatzes in TensorFlow (2.x) habe ich versucht zu bestätigen, dass der Wert wie erwartet ist. Print ( Aufruf)
gibt den Wert möglicherweise nicht aus.
Sie könnten einen Debugger wie "tfdbg" verwenden, aber hier ist eine einfachere Möglichkeit, das sogenannte "Print-Debugging" durchzuführen.
Für tfdbg
→ Verwenden Sie tfdbg, um Keras nan und inf - Qiita zu zerstören
Im folgenden Code wird angenommen, dass ↓ geschrieben ist.
import tensorflow as tf
Eager Execution ist jetzt die Standardeinstellung in TensorFlow 2.x. Solange Sie "Tensor" mit dem Interpreter zusammenstellen, können Sie einfach "print ()" ausführen, um den Wert von "Tensor" anzuzeigen. Sie können den Wert auch als "ndarray" mit ".numpy ()" erhalten.
x = tf.constant(10)
y = tf.constant(20)
z = x + y
print(z) # tf.Tensor(30, shape=(), dtype=int32)
print(z.numpy()) # 30
Da es langsam ist, den Wert von "Tensor" zum Zeitpunkt des Lernens / der Bewertung nacheinander auszuwerten, ist es möglich, die im Grafikmodus zu verarbeitende Funktion durch Hinzufügen des Dekorators "@ tf.function" zu definieren. ** Im Diagrammmodus definierte Vorgänge werden zusammen als Berechnungsdiagramm (außerhalb von Python) verarbeitet, sodass Sie die Werte im Berechnungsprozess nicht sehen können. ** ** **
@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)
Sie können das Berechnungsergebnis außerhalb von dot ()
ausgeben, aber Sie können den Wert darin nicht sehen.
Selbst wenn Sie "dot ()" mehrmals aufrufen, wird "print ()" im Inneren zum Zeitpunkt der Analyse des Diagramms grundsätzlich nur einmal ausgeführt.
In diesem Fall können Sie natürlich die @ tf.function ()
entfernen, um den Wert zu sehen.
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)
Es kann implizit im Grafikmodus ausgeführt werden, z. B. wenn map ()
für tf.data.Dataset
verarbeitet wird oder wenn Sie Ihre eigene Verlustfunktion in Keras verwenden. In diesem Fall können Sie den Wert in der Mitte mit print ()
nicht sehen, auch wenn ** @ tf.function
nicht hinzugefügt wird. ** ** **
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()
Verwenden Sie tf.print ()
, um den Wert von Tensor
im Prozess anzuzeigen, der im Grafikmodus ausgeführt wird.
tf.print | TensorFlow Core v2.1.0
Sie können die Werte wie folgt anzeigen oder "tf.shape ()" verwenden, um die Abmessungen und die Größe von "Tensor" anzuzeigen. Bitte verwenden Sie es auch zum Debuggen, wenn Sie wütend werden, wenn die Abmessungen und Größen aus irgendeinem Grund in Ihrer eigenen Funktion nicht übereinstimmen.
@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)
Wenn Sie "Dataset.map ()" debuggen möchten, können Sie "tf.print ()" verwenden.
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)
# :
Wenn Sie dann an nichts denken und den Inhalt von Tensor
mit tf.print ()
ausgeben sollten, ist dies nicht der Fall.
tf.print ()
wird ausgeführt, wenn der Prozess tatsächlich als berechneter Graph ausgeführt wird.
Mit anderen Worten, wenn Sie feststellen, dass die Typen und Dimensionen zum Zeitpunkt der Diagrammanalyse nicht übereinstimmen, ohne eine ** Berechnung durchzuführen, und ein Fehler auftritt, wird die Verarbeitung von "tf.print ()" nicht ausgeführt. ** Es ist kompliziert ...
@tf.function
def add(x, y):
z = x + y
tf.print(z) #Dieser Druck wird nicht ausgeführt
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].
In einem solchen Fall ist es besser, gewöhnliches print ()
zu verwenden, um zu überprüfen, ob die Daten der gewünschten Form übergeben werden.
@tf.function
def add(x, y):
print(x) #Dieser Druck wird während der Analyse des Berechnungsdiagramms ausgeführt
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].
Zählen Sie beispielsweise, wie oft Ihre eigene Funktion im Diagrammmodus aufgerufen wurde, und zeigen Sie die Anzahl der Aufrufe an.
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" wird auch beim zweiten Mal angezeigt.
Dies liegt daran, dass count + = 1
als Python-Code während der Diagrammanalyse nur einmal ausgeführt wird.
Die richtige Antwort ist, "tf.Variable ()" und "assign_add ()" wie unten gezeigt zu verwenden. 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)
Leistungsverbesserung mit tf.function | TensorFlow Core (Offizielles Dokument)