【问题标题】:Tensorflow Linear Regression NaN outputTensorflow 线性回归 NaN 输出
【发布时间】:2019-04-12 07:31:33
【问题描述】:

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

(没有足够的声誉来嵌入图片)https://i.imgur.com/lxgC7YV.png

“相当于分段线性回归模型。”

从(等式 7):

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

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

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)

初始化后,我使用以下内容进行训练:

for i in range(10000):
    sess.run(train_step, feed_dict={_x1: timedVecs, _x2 : originalVecs})
    if i % 1001 == 0:
        print('Epoch ', i)
        print('Prediction ', sess.run(prediction, feed_dict={_x1: timedVecs, _x2 : originalVecs}).shape)

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

预测的形状是 [20,300],而我预计它是 [1,300]。我希望它基于单个 x1 和 x2 进行预测,而不是一次全部预测,然后尝试从所有数据点的误差总和中学习(我假设分段是)。我不知道如何解决这个问题,因为我认为目前我正在根据 20,300 矩阵而不是 20 1,300 矩阵的总和进行最小化。

我假设 matmul 是正确的,因为乘法是元素明智的?

我将输入数据作为 np 数组的列表输入。每个 np 数组是一个 300 维的数据点。

谢谢。

【问题讨论】:

  • 我没有过多地研究它,但tf.norm 在您使用它时会压平张量并计算结果向量的范数。因为你也有tf.reduce_sum 这让我觉得你真的想计算prediction 行的范数。您可以为此使用 axis 参数。
  • 你说得对,我确实错过了。范数应该计算向量范数并返回一个包含 20 个条目的数组。我已经纠正了这一点,但错误仍在传播。谢谢。

标签: python tensorflow regression linear-regression


【解决方案1】:

通常我会避免损失的平方根。问题是x**0.5的导数是0.5 * x**-0.5,这意味着除以x。如果 x 永远为零,这将产生 NaN。在这种情况下,平方根来自tf.norm,紧随其后的是tf.square,但这些操作没有融合在一起,也不会取消。

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

【讨论】: