2016-05-17 2 views
4

私は、線形回帰を構築するTensorflow例で遊んでいた、と私のコードは以下の通りです:Tensorflow「feed_dict」:キーと値のペアのために同じシンボルを使用するには、「TypeError例外を:テンソルとしてfeed_dictキーを解釈することはできません」だ

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()) 
私はバグがここにあった実現深く掘った後

--------------------------------------------------------------------------- 
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. 

feed_dict={X: x, y: y} 

しかし、上記実行すると、私は、このエラーを与えます

ここで、使用しているキーと値のペアは同じです( 'y'と 'y')。 Y:yに変更してそれに応じて残りの部分を変更した場合:

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}) 

コードは完全に実行されます。私はfeed_dictにキーと値のペアのために同じシンボルを使用することができなかった理由を

は非常に疑問に思って?左上の「y」(キー)は上記のコスト関数の「y」を参照するべきではありませんか?

答えて

13

feed_dict引数は、キーとしてTensorを必要とする辞書です。修正した例では、XYはそれらのテンソルです。あなたが別の変数の名前をXまたはYを使用している場合

しかし、あなたは、もはやあなたのグラフからテンソルに対応していないだろう最初のテンソルとXまたはYが上書きされます。 Tensorflowは、上書きされたグラフのノードを参照していることを理解できません。一言で言えば

、あなたは不可能である二つの異なる変数に同じ名前を使用しようとしています。

0

変更 sess.run(optimizer, feed_dict={X: x, y: y}) からsess.run(optimizer, feed_dict={X: train_x, y: train_y})。 fedd_dictの値は、オプティマイザにフィードしたい実際の入力値です。

関連する問題