为什么训练误差随着每个时期而增加,使用张量流实现线性回归?

时间:2017-06-01 11:34:08

标签: python numpy tensorflow

我是tensorflow的新手并且已经实现了线性回归模型。我正在使用的数据集可在https://archive.ics.uci.edu/ml/datasets/Housing中找到。在每个时代,损失都在增加。 这是我的代码 -

import tensorflow as tf
import numpy as np

A = np.loadtxt("housing.data",dtype=np.float32)
s = A.shape
B = A[:,:s[1]-1]
C = A[:,-1]
C = C.reshape(s[0],1)

W = tf.Variable(tf.ones([s[1]-1,1]))
b = tf.Variable([.3],tf.float32)

x = tf.placeholder(tf.float32,shape = (None,s[1]-1))
y = tf.placeholder(tf.float32,shape = (None,1))

linear_model = tf.matmul(x,W) + b
loss = tf.reduce_mean(tf.square(linear_model - y)) # sum of the squares
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

for i in xrange(1000):
    sess.run(train,feed_dict={x:B,y:C})


curr_W, curr_b, curr_loss  = sess.run([W, b, loss], feed_dict={x:B, y:C})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

1 个答案:

答案 0 :(得分:2)

在达到NaN之前,您的损失只会增加几次。问题似乎是初始损失非常大(10^13),因此可能也是它的梯度,这会产生一个太大的更新,使你的参数更加糟糕,并最终产生NaN的梯度反向传播(可能通过某种方式溢出,或者因为它在某处产生值0并除以它)。

你可以通过降低你的学习率来解决这个问题,这将从一开始就弥补这个巨大的梯度值。 0.000001为我解决了这个问题(虽然与通常的学习率相比,这是一个非常低的值,所以仅在第一步中使用它是一个小问题)。但是,由于它只是一开始,您可能希望在其余训练中获得更高的学习率。您可以在几个步骤后更改它,或者更强大的内容将更改为clip your gradient

修改

此外,您应该随意初始化您的体重:

W = tf.Variable(tf.truncated_normal([s[1]-1,1], stddev=0.1))

通过随机优化,渐变剪裁,它对我学得很好:

optimizer = tf.train.GradientDescentOptimizer(0.0005)

gvs = optimizer.compute_gradients(loss)
capped_gvs = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gvs]
train = optimizer.apply_gradients(capped_gvs)

10000次迭代和learning rate = 0.0005,但你应该使用一个衰减的学习率,从那里开始,一段时间后变小。