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中实现多项式回归(二次)。损失不会收敛。有谁可以帮我解决这个问题。类似的逻辑虽然适用于线性回归!
答案 0 :(得分: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
左右后,您可以将其提高。