Tensorflow线性回归NaN输出

时间:2018-11-08 18:08:07

标签: python tensorflow regression linear-regression

我正在尝试为机器学习算法编写代码,以学习机器学习概念和Tensorflow。我要写的算法是:

(信誉不佳,无法嵌入图像)https://i.imgur.com/lxgC7YV.png

“这等效于分段线性回归模型。”

来自(等式7):

https://arxiv.org/pdf/1411.3315.pdf

我已经加载了要执行的向量。并初始化我的占位符和变量:

>>> l = [{27309053}, {23625724}, {25051134}]
>>> [x for x, in l]
>>> [27309053, 23625724, 25051134]

我设置的预测,成本和培训步骤如下:

size = len(originalVecs)
_x1 = tf.placeholder(tf.float64, shape=[size, 300], name="x1-input")
_x2 = tf.placeholder(tf.float64, shape=[size, 300], name="x2-input")

_w = tf.Variable(tf.random_uniform([300,300], -1, 1, dtype = tf.float64), name="weight1")

初始化后,我将进行以下训练:

prediction = tf.matmul(_x1,_w)
cost = tf.reduce_sum(tf.square(tf.norm(prediction - _x2)))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)

当我运行我的代码时,它非常不稳定,并且仅在大约20次迭代中就增长了,只能打印NaN。我认为我做错了几件事,但我不知道如何纠正。

当我希望预测值为[1,300]时,预测的形状为[20,300]。我希望它基于单个x1和x2进行预测,而不是一次全部预测,然后尝试从所有数据点的误差总和中学习(我假设是分段的)。我不确定如何处理此问题,但是由于我认为目前正在基于20,300矩阵而不是20,1,300矩阵的总和最小化。

我认为matmul是正确的,因为乘法是元素明智的选择?

我正在输入输入数据作为np数组的列表。每个np数组都是一个具有300维的数据点。

谢谢。

1 个答案:

答案 0 :(得分:0)

通常,我会避免损失的平方根。问题在于x**0.5的派生词是0.5 * x**-0.5,这意味着除以x。如果x为零,将产生NaN。在这种情况下,平方根来自tf.norm,紧随其后的是tf.square,但是这些运算不会融合在一起并且不会取消。

将损失表达式简化为tf.reduce_sum(tf.square(prediction - _x2))应该会使情况更加稳定。