2016-12-27 4 views
6

ich TensorFlow aus dem Beispiel lernte an: https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynbTensorFlow: tf.placeholder und tf.Variable - Warum wird die Dimension nicht benötigt?

Ich habe ein paar Fragen in dem folgenden Code: Bei der Definition der Platzhalter und Variablen wie X, Y, W und b, warum nicht brauchten wir spezifizieren Sie die Dimension von ihnen? Wie würde der Code Speicher zuweisen, ohne die Größe dieser Platzhalter/Variablen zu kennen? Vielen Dank!

# tf Graph Input 
    X = tf.placeholder("float") 
    Y = tf.placeholder("float") 

    # Set model weights 
    W = tf.Variable(rng.randn(), name="weight") 
    b = tf.Variable(rng.randn(), name="bias") 


    # Construct a linear model 
    pred = tf.add(tf.mul(X, W), b) 

Antwort

6

TensorFlow des tf.placeholder() Tensoren benötigen Sie keine Form geben, um Sie zu Feed Tensoren verschiedener Formen in einem späteren tf.Session.run() Anruf zu ermöglichen. Standardmäßig hat ein Platzhalter eine vollständig unbeschränkte Form, Sie können ihn jedoch einschränken, indem Sie das optionale Argument shape übergeben. Beispiel:

w = tf.placeholder(tf.float32)      # Unconstrained shape 
x = tf.placeholder(tf.float32, shape=[None, None]) # Matrix of unconstrained size 
y = tf.placeholder(tf.float32, shape=[None, 32]) # Matrix with 32 columns 
z = tf.placeholder(tf.float32, shape=[128, 32])  # 128x32-element matrix 

Wenn Sie einen Platzhalter erstellen, reserviert TensorFlow keinen Speicher. Wenn Sie stattdessen den Platzhalter füttern, wird TensorFlow in dem Aufruf an tf.Session.run() entsprechend Speicher für die Eingabe (und anschließend für alle erforderliche Zwischen-Tensoren) reservieren.

Beachten Sie, dass tf.Variable Objekte normalerweise eine Form erfordern, wenn Sie sie erstellen, und diese Form wird vom ersten Argument des Initialisierers abgeleitet. In Ihrem Programm gibt rng.randn() (ein Alias ​​für numpy.random.randn()) einen Skalarwert zurück, und so haben die Variablen W und b skalare Form.

Obwohl die Platzhalter in Ihrem Code (X und Y) haben unbeschränkte Form, einige der Operatoren wie tf.add() und tf.mul(), müssen zusätzliche Anforderungen über die Form ihrer Argumente (viz., Dass sie kompatibel mit den NumPy broadcasting rules) . Da TensorFlow beim Erstellen des Diagramms nicht weiß, wie die tatsächlichen Formen dieser Tensoren aussehen, vertraut es darauf, dass der Benutzer weiß, was er tut, und führt die Überprüfung dynamisch aus (während des Aufrufs an tf.Session.run()). Wenn Sie stattdessen die Formen der Platzhalter einschränken, aktivieren Sie TensorFlow, um einige Prüfungen früher durchzuführen, und dies kann dazu beitragen, Fehler zu reduzieren.

+0

Danke! Wie wäre es mit dem variablen Fall? – Edamame

+0

Habe gerade gesehen, dass du auch danach gefragt hast ... Ich habe die Antwort aktualisiert, um es zu erklären. – mrry

+0

wie ich den Code in https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/2_BasicModels/linear_regression.ipynb gelesen habe Es scheint mir, dass die Variable W ein Array ist, kein Skalar. Verstehe ich das falsch? Vielen Dank! – Edamame

Verwandte Themen