2016-05-17 2 views
4

Ich spielte mit Tensorflow Beispiele für den Aufbau einer linearen Regression, und meine Codes sind unter ‚Typeerror Kann nicht feed_dict Schlüssel als Tensor interpretieren‘:Tensorflow ‚feed_dict‘: gleiche Symbol für Schlüssel-Wert-Paar mit bekam:

import numpy as np 
import tensorflow as tf 

train_X = np.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,7.042,10.791,5.313,7.997,5.654,9.27,3.1]) 
train_Y = np.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,2.827,3.465,1.65,2.904,2.42,2.94,1.3]) 

n_samples = train_X.shape[0] 
batch_size = 100 

total_epochs = 50 

X = tf.placeholder('float') 
y = tf.placeholder('float') 

W = tf.Variable(np.random.randn(), name="weights") 
b = tf.Variable(np.random.randn(), name="bias") 

y_pred = tf.add(tf.mul(X, W), b) 

cost = tf.reduce_sum(tf.pow(y_pred-y, 2))/(2*n_samples) #L2 loss 
optimizer = tf.train.AdamOptimizer().minimize(cost) #Gradient 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    print("Initia values for W and b: ", W.eval(), b.eval()) 
    for _ in range(total_epochs): 
     sess.run(optimizer, feed_dict={X: x, y: y}) 
    print("Value for W and b after GD: ", W.eval(), b.eval()) 

jedoch geben die oben läuft mir diesen Fehler:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-11-185d8e05cbcd> in <module>() 
    28  for _ in range(total_epochs): 
    29   for (x, y) in zip(train_X, train_Y): 
---> 30    sess.run(optimizer, feed_dict={X: x, y: y}) 
    31   print("Value for W and b after GD: ", W.eval(), b.eval()) 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata) 
    338  try: 
    339  result = self._run(None, fetches, feed_dict, options_ptr, 
--> 340       run_metadata_ptr) 
    341  if run_metadata: 
    342   proto_data = tf_session.TF_GetBuffer(run_metadata_ptr) 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata) 
    540   except Exception as e: 
    541    raise TypeError('Cannot interpret feed_dict key as Tensor: ' 
--> 542        + e.args[0]) 
    543 
    544   if isinstance(subfeed_val, ops.Tensor): 

TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float64 into a Tensor. 

Nach dem Graben tiefer erkannte ich die Fehler hier war:

feed_dict={X: x, y: y} 

wo das Schlüssel-Wert-Paar verwendet wird, ist das gleiche ('y' und 'y'). Und wenn ich es zu Y: y änderte und den Rest entsprechend änderte:

Y = tf.placeholder('float') 
cost = tf.reduce_sum(tf.pow(y_pred-Y, 2))/(2*n_samples) #L2 loss 
sess.run(optimizer, feed_dict={X: x, Y: y}) 

Die Codes werden perfekt laufen.

Ich wundere mich, warum ich nicht das gleiche Symbol für das Schlüssel-Wert-Paar in feed_dict verwenden konnte? Sollte sich das "y" auf der linken Seite (der Schlüssel) nicht auf das "y" in der obigen Kostenfunktion beziehen?

Antwort

13

Das Argument feed_dict ist ein Wörterbuch, das Tensor als Schlüssel benötigt. In Ihrem korrigierten Beispiel sind X und Y diese Tensoren.

Wenn Sie jedoch X oder Y für den Namen einer anderen Variablen verwenden, überschreiben Sie die ersten Tensoren und X oder Y wird nicht mehr auf den Tensor aus Ihrem Diagramm entsprechen. Tensorflow kann nicht verstehen, dass Sie auf die Knoten aus Ihrem Diagramm verweisen, da diese überschrieben wurden.

Kurz gesagt, Sie versuchen, den gleichen Namen für zwei verschiedene Variablen zu verwenden, was unmöglich ist.

0

Änderung sess.run(optimizer, feed_dict={X: x, y: y}) zu sess.run(optimizer, feed_dict={X: train_x, y: train_y}). Die Werte von Fedd_dict sind die tatsächlichen Eingaben, die Sie dem Optimierer zuführen möchten.

Verwandte Themen