2016-05-31 1 views
1

私はtensorflowにはかなり新しいです。私はテンソルフローで線形回帰を行いました。 以下のコードを実行すると、typeErrorが次のようになった:テンソルフローの線形回帰を実行しているときにTypeErrorが発生しました。 'Opの型はfloat64型で、引数のfloat32型と一致しません'

TypeError: 'Mul'の 'y'を入力すると、引数 'x'のfloat32型と一致しないfloat64型があります。

時間を費やしましたが、理由を把握できませんでした。 どこが間違っていましたか?助けを非常に感謝します。どうもありがとう。

import tensorflow as tf 
import numpy as np 

training_epoch = 1000 
display_epoch=50 
learning_rate = 0.01 
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] 
X = tf.placeholder('float') 
Y= tf.placeholder ('float') 
w = tf.Variable(np.random.randn(2)) 
pred = tf.add(tf.mul(X,w[0]), w[1]) 

loss = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples) 
init = tf.initialize_all_variables() 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) 

with tf.Session() as session: 
    session.run(init) 
    for epoch in range(training_epoch): 
     for x, y in zip(train_X, train_Y): 
      session.run(optimizer, feed_dict={X:x, Y:y}) 
     if (epoch+1) % display_epoch == 0: 
      weight = session.run(w) 
      bias = session.run(b) 
      cost = session.run(loss, feed_dict={X:train_X, Y:train_Y}) 
      print('epoch: {0:.2f}, weight: {1:.9f}. bias: {2:.9f}, cost: {3:.9f}'.format(epoch+1,weight[0], weight[1], cost)) 
    print('optimization complete') 

答えて

2

TL; DR:プレースホルダXと変数wは異なる要素タイプを持っている、とTensorFlowは自動的にOPの引数をキャストしませんので、tf.mul() opは失敗します。

X = tf.placeholder('float') 

あなた可変wのためtf.float64型を持つ:

プレースホルダXは、「32ビット浮動小数点」を意味すると定義されるDTYPE 'float'を有するように定義されているので、このラインにおいて、tf.float32を入力有します

w = tf.Variable(np.random.randn(2)) 

最も簡単な解決策:これは、この行では、np.float64のDTYPEを持っているnp.random.randn(2)、初期化されタイプtf.float32を持つものとしてwを定義するには、次のようになります。

w = tf.Variable(np.random.randn(2).astype(np.float32)) 

また、あなたがタイプtf.float64を持つものとしてXを定義することができます。

X = tf.placeholder(tf.float64) 

あり、明示的な変換を行うためのtf.cast()オペアンプでもあるが、私は「wouldnそれを区別することができないので、それを使用することをお勧めします。したがって、コンピューティングの勾配を妨げる可能性があります。


PS。それは(ここでは2要素ベクトルのような)小さな変数に対してあまり重要ではありませんが

w = tf.Variable(tf.random_normal([2])) 

:これを行うにはより多くの慣用的な方法は、グラフに大きな定数を入れて回避tf.random_normal()オペアンプを使用することですはるかに大きな重み行列にとってより重要になる。

+0

詳細な説明をいただきありがとうございます。 – zesla

関連する問題