2016-02-26 11 views
6

In ipython importierte ich tensorflow as tf und numpy as np und erstellte einen TensorFlow InteractiveSession. Wenn ich laufe oder eine Normalverteilung mit numpy Eingang Initialisierung läuft alles in Ordnung:TensorFlow: Erzeugen einer zufälligen Konstante

some_test = tf.constant(np.random.normal(loc=0.0, scale=1.0, size=(2, 2))) 
session.run(some_test) 

Returns:

array([[-0.04152317, 0.19786302], 
     [-0.68232622, -0.23439092]]) 

Genau wie erwartet.

... aber wenn ich die Tensorflow Normalverteilungsfunktion verwenden:

some_test = tf.constant(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)) 
session.run(some_test) 

... es wirft eine Art Fehler sagen:

(...) 
TypeError: List of Tensors when single Tensor expected 

Was ich hier fehlt?

Der Ausgang:

sess.run(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)) 

allein liefert genau dasselbe, die np.random.normal erzeugt -> eine Matrix von Form (2, 2) mit Werten aus einer Normalverteilung entnommen.

Antwort

8

Die Operation tf.constant() op benötigt ein numpy Array (oder etwas, das implizit in ein numpy Array konvertiert werden kann) und gibt tf.Tensor zurück, deren Wert dem Array entspricht. Es tut nicht akzeptieren ein tf.Tensor als sein Argument.

Auf der anderen Seite gibt die tf.random_normal() op eine tf.Tensor zurück, deren Wert zufällig nach der angegebenen Verteilung jedes Mal generiert wird, wenn es ausgeführt wird. Da es tf.Tensor zurückgibt, kann es nicht als Argument für tf.constant() verwendet werden. Dies erklärt die TypeError (die nicht mit der Verwendung von tf.InteractiveSession verwandt ist, da es auftritt, wenn Sie das Diagramm erstellen).

Ich nehme an, Sie möchten, dass Ihr Graph einen Tensor enthält, der (i) zufällig bei seiner ersten Verwendung erzeugt wird und (ii) danach konstant ist. Es gibt zwei Möglichkeiten, dies zu tun:

  1. Verwenden NumPy den Zufallswert zu generieren und in einem tf.constant() setzen, wie Sie in Ihrer Frage haben:

    some_test = tf.constant(
        np.random.normal(loc=0.0, scale=1.0, size=(2, 2)).astype(np.float32)) 
    
  2. (potentiell schneller, als es verwenden, um die GPU kann die Zufallszahl) Verwendung TensorFlow zu erzeugen, um den Zufallswert zu generieren und sie in einem tf.Variable:

    some_test = tf.Variable(
        tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32) 
    sess.run(some_test.initializer) # Must run this before using `some_test` 
    
+2

Danke für die Erklärung! Also muss ich "tf.Variable" verwenden, wenn ich die GPU-Beschleunigung aka "reinen" Tensorflow für eine zufällige "Konstante" bekommen möchte ?! – daniel451

+0

Ja, es ist nicht intuitiv, nicht wahr? :) Das Problem ist, dass in TF die Konzepte "is variable" und "is initializable" im selben Typ kombiniert sind - wir haben gelegentlich bessere Möglichkeiten zur Initialisierung diskutiert (zB ein Äquivalent der statischen Initialisierung in C-). wie Sprachen), haben sich aber noch nicht für ein Design entschieden.(Man könnte sich vorstellen, dass so etwas für Optimierungen wie konstantes Falten usw. nützlich sein könnte) – mrry

+1

Danke für die Antwort @mrry. Wenn ich versuche, das Gleiche zu tun, aber ich möchte 'some_test' danach nicht konstant halten, würde ich dasselbe tun wie Option 2, aber nicht 'sess.run (some_test.initializer)' einschließen? – bnorm

Verwandte Themen