-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 で多項式回帰 (二次) を実装しようとしています。損失が収束していません。誰でもこれで私を助けてくれませんか。ただし、線形回帰でも同様のロジックが機能しています。

4

1 に答える 1

1

まず、 と の形状に問題がありY_predますY

  • Y未知の形状を持ち、形状の配列が与えられます(1000,)
  • Y_pred形がある(1000, 1)
  • Y - 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

于 2016-07-16T14:54:06.357 に答える