【问题标题】:TensorFlow Linear Regression - returning NaN for weights,bias and Inf for lossTensorFlow 线性回归 - 返回 NaN 权重、偏差和 Inf 损失
【发布时间】:2019-10-14 21:39:43
【问题描述】:

我正在尝试在 TensorFlow 中进行以下线性回归,但我的输出都是 Inf 和 NaN。

我的输入数据集必须是 Y=0.5*X + 2 + Noise;其中 X 是大小 (1000) 的正态分布,噪声是高斯分布 (mu=0.0 and sigma=50)

输出:

损失= 82662.945 W= 15974.369 b 24.379812

损失= 81293050000000.0 W= -508895600.0 b -775064.06

损失= 8.250697e+22 W= 16212403000000.0 b 24692003000.0

损失= 8.373905e+31 W= -5.1649487e+17 b -786638100000000.0

损失= inf W= 1.6454498e+22 b 2.5060722e+19

损失= inf W= -5.2420755e+26 b -7.9838474e+23

损失= inf W= 1.6700204e+31 b 2.543495e+28

损失= inf W= -5.320352e+35 b -8.1030665e+32

损失= inf W= inf b inf

损失= inf W= nan b nan

损失= nan W= nan b nan

损失= nan W= nan b nan

损失= nan W= nan b nan

import tensorflow as tf
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt


noise=np.random.normal(0.0,50,1000)#.astype(np.float32)
x_data=np.random.uniform(0,1000,1000)#.astype(np.float32)
y_data=0.5*x_data+2+noise#.astype(np.float32)

plt.scatter(x_data,y_data,s=0.1)
plt.show()


X=tf.placeholder(shape=(1000,),dtype=tf.float32)
Y=tf.placeholder(shape=(1000,),dtype=tf.float32)

#Learning W and b over the epochs
W=tf.get_variable(name='Weight',dtype=tf.float32,shape(),initializer=tf.zeros_initializer())
b=tf.get_variable(name='Bias',dtype=tf.float32,shape=(),initializer=tf.zeros_initializer())

Y_pred= tf.add(tf.multiply(X, W),b)
loss = tf.reduce_mean(tf.square(Y_pred - Y))



optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss)

epochs=100
with tf.Session() as sess:
init=tf.global_variables_initializer()
sess.run(init)
for e in range(epochs):
    _,c=sess.run([optimizer,loss],feed_dict={X: x_data,Y: y_data})
    print('loss=',c,'W=',sess.run(W),'b',sess.run(b))

#plt.scatter(x_data, y_data, 'ro', label='Original data')
plt.plot(x_data, sess.run(W) * x_data + sess.run(b), label='Fitted line')
plt.legend()
plt.show()

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    您巧妙地重新创建了exploding gradient problem 的简单示例。

    您可以阅读潜在的解决方案,但最简单的玩具示例可能是降低您的学习率。

    直观地说,梯度下降就像试图通过指向下坡方向并迈出一步来寻找通往谷底的路,然后重复。在每个阶段,您都根据现在的下坡情况重新评估方向。如果山谷是平滑的,没有局部低点,并且您的步长足够小,您最终会找到底部。

    学习率类似于步长。

    因此,如果学习率太高,您现在可以想象自己正在迈出如此大的一步,以至于您直接跨过整个山谷,到达对面山上更高的一点。然后你转身再次指向下坡(大约 180 转)并面向山谷的中心,但向右跨到另一边更高的地方。以此类推,在山谷的对面越来越高

    因此,将您的学习率大幅降低到这样的水平似乎可以使其收敛:

    optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.000001).minimize(loss)
    

    【讨论】:

    • 谢谢!但是我注意到我的损失值非常高,2000++
    • 另外,我需要将数据集拆分为测试和训练,那么我应该如何进行测试呢?
    • @Dude1234 很高兴。 :-) 很高兴我能提供帮助 - 如果您认为值得并回答了您最初的问题,那么您可以接受/投票。关于您的后续问题 - 在 stackoverflow 上,通常最好向您的后续问题询问一个新问题(首先检查它以前没有被问过并检查问题提问指南等),以便每个问题都是简洁和独立的问答,所以它最好在整个社区都可以看到的地方重新发布,而不是在这里发表评论
    猜你喜欢
    • 2019-12-31
    • 2018-11-07
    • 2017-06-22
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多