Ich versuche zu lernen, wie man mit Tensorflow-Übersichtsschreibern arbeitet, indem ich dem HowTo mnist-Tutorial folge. Dieses Tutorial fügt eine skalare Zusammenfassung für die Verlustfunktion hinzu. Ich habe eine Verlustfunktion in einem ungewöhnlichen geschrieben, indem ich einen Regularisierungsbegriff aufbaute, und ich bekomme diese Ausnahme:
%Vor%Die Verlustfunktion und das Hinzufügen der Zusammenfassung sehen wie
aus %Vor%und wenn ich den RegularizationTerm wie folgt aufbauen
%Vor%waren regA und regB sind tf.Variables zuvor definiert, bekomme ich die Ausnahme, während ich es wie
aufbauen werde %Vor%dann funktioniert es. Ich schätze, ich setze den Namen nicht korrekt, wenn ich das + mache = ich erschaffe einen neuen Tensor, der ungezähmt ist? Aber warum kann ich das nicht dem Verlust hinzufügen und dann den Verlust nennen? Das ist das einzige, was ich zusammenfassen möchte?
Gibt es etwas wie + = wo kann ich die Ausgabe nennen, oder den Namen des Tensors behalten, den ich verändere?
Falls das Problem etwas anderes betrifft, hier mein einfaches Beispiel, in dem ich das Problem identifiziert habe:
%Vor% TL; DR: Das Problem ist die Form des Arguments für tf.scalar_summary()
, nicht die Namen.
Ich denke, das Problem ist ein formbezogenes Problem, das sich aus dieser Linie ergibt:
%Vor% Dies definiert eine Variable, deren Form ein Vektor der Länge 1 ist. Die nachfolgenden +=
Operatoren (die syntaktischer Zucker für tf.add()
) und das tf.add()
für die Berechnung von loss
erzeugt vektorförmige Ergebnisse, weil tf.add()
Broadcasts das skalare Argument, um ein Vektor zu werden. Schließlich erwartet tf.scalar_summary()
, dass die beiden Argumente die gleiche Form haben - Anders als bei der Rundsendung add
, tf.scalar_summary()
ist die Form der Eingänge nicht zulässig. Der tags
-Eingang ist ein skalarer String (der Name des loss
op), während der values
-Eingang ein Vektor der Länge eins ist (der Wert des loss
Tensors). Daher erhalten Sie den Fehler, den Sie gemeldet haben.
Zum Glück ist die Lösung einfach! Definieren Sie entweder die Variable regularizationTerm
als Skalar, etwa so:
... oder übergeben Sie einen Vektor (der Länge 1) von Strings an tf.scalar_summary()
:
Da dies ein Problem in Bezug auf die Form eines Tensors mit der Dimension der Größe 1 ist, könnten Sie versuchen, tf.squeeze
zu verwenden, das Dimensionen der Größe 1 aus der Form eines Tensors entfernt.
In Ihrem Fall könnten Sie
ersetzen tf.scalar_summary(loss.op.name, loss)
mit
tf.scalar_summary(loss.op.name, tf.squeeze(loss))
Tags und Links tensorflow