我正在尝试在TensorFlow中进行以下线性回归,但是我的输出是所有Inf和NaN。
我的输入数据集必须为Y = 0.5 * X + 2 + Noise;其中X是大小为(1000)的正态分布,噪声为高斯分布,其中(mu = 0.0和sigma = 50)
输出:
损失= 82662.945瓦= 15974.369羽24.379812
loss = 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
loss = inf W = 1.6454498e + 22 b 2.5060722e + 19
loss = inf W = -5.2420755e + 26 b -7.9838474e + 23
loss = inf W = 1.6700204e + 31 b 2.543495e + 28
loss = inf W = -5.320352e + 35 b -8.1030665e + 32
loss = inf W = inf b inf
loss = inf W = nan b nan
loss = nan W = nan b nan
loss = nan W = nan b nan
loss = 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()
答案 0 :(得分:0)
您已经巧妙地重新创建了exploding gradient problem的简单示例。
您可以阅读潜在的解决方案,但是最简单的玩具示例可能是降低学习率。
直觉上,梯度下降就像是尝试通过指向下坡方向并迈出一步然后再重复来找到通往谷底的道路。在每个阶段,您都根据当前的下坡情况重新评估方向。如果山谷是光滑的,没有局部低点,并且步长足够小,那么您最终将找到底部。
学习速度类似于步长。
因此,由于学习率太高,您现在可以想象您正在迈出如此大的步伐,以至于跨过整个山谷到达对面山上更高的一点。然后转弯以再次指向下坡(大约180度)并面向山谷的中心,但向右越过,越过另一侧更高。依此类推,越来越高的山谷对面
因此,将学习率显着降低到这样的水平似乎可以使其收敛:
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.000001).minimize(loss)