2016-07-15 9 views
-1
import numpy as np 
import tensorflow as tf 


#input data: 
x_input=np.linspace(0,10,1000) 
y_input=x_input+np.power(x_input,2) 

#model parameters 
W = tf.Variable(tf.random_normal([2,1]), name='weight') 
#bias 
b = tf.Variable(tf.random_normal([1]), name='bias') 

#placeholders 
#X=tf.placeholder(tf.float32,shape=(None,2)) 
X=tf.placeholder(tf.float32,shape=[None,2]) 
Y=tf.placeholder(tf.float32) 
x_modified=np.zeros([1000,2]) 

x_modified[:,0]=x_input 
x_modified[:,1]=np.power(x_input,2) 
#model 
#x_new=tf.constant([x_input,np.power(x_input,2)]) 
Y_pred=tf.add(tf.matmul(X,W),b) 

#algortihm 
loss = tf.reduce_mean(tf.square(Y_pred -Y)) 
#training algorithm 
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 
#initializing the variables 
init = tf.initialize_all_variables() 

#starting the session session 
sess = tf.Session() 
sess.run(init) 

epoch=100 

for step in xrange(epoch): 
    # temp=x_input.reshape((1000,1)) 
    #y_input=temp 

    _, c=sess.run([optimizer, loss], feed_dict={X: x_modified, Y: y_input}) 
    if step%50==0 : 
     print c 

print "Model paramters:"  
print sess.run(W) 
print "bias:%f" %sess.run(b) 

Tensorflowで多項式回帰(二次)を実装しようとしています。損失は​​収束していません。誰もがこれで私を助けてくださいでしたか?同様の論理が線形回帰のために働いています!Tensorflowの多項式回帰で収束しない

答えて

1

Y_predYのためのあなたの形状に問題がある:まず

  • Y

    は、未知の形状を有し、かつ(1000, 1)
  • Y - Y_pred形状(1000,)
  • Y_predが持つ形状の配列となります供給され、形状を持っている(1000, 1000)
a = tf.zeros([1000]) # shape (1000,) 
b = tf.zeros([1000, 1]) # shape (1000, 1) 
print (a-b).get_shape() # prints (1000, 1000) 

あなたが使用する必要があり、一貫したタイプ::あなたは(入力との間に非常に高い値を持っているので、とにかく


y_input = y_input.reshape((1000, 1)) 

Y = tf.placeholder(tf.float32, shape=[None, 1]) 
は、損失が爆発しているこの小さなコードは、私のポイントを証明します0と100、あなたはそれを正規化する必要があります)非常に高い損失(訓練の冒頭で約 2000)。
勾配が非常に高く、パラメータが爆発し、損失が無限になります。

最も速い修正は、学習率を下げることです(1e-5は私のために収束しますが、最後は非常にゆっくりです)。損失が収束した後には、それを約1に収束させることができます。

+0

ありがとうございます。それは魅力のように働いた:)。また、入力範囲を0-2に縮小した後、学習率「0.01」自体に収束する。 –

関連する問題