Python 简单线性回归未能在tensorflow中收敛

Python 简单线性回归未能在tensorflow中收敛,python,machine-learning,tensorflow,linear-regression,gradient-descent,Python,Machine Learning,Tensorflow,Linear Regression,Gradient Descent,我不熟悉机器学习和Tensorflow。目前,我正试图按照教程的逻辑创建一个简单的线性回归模型,形式为y=a*x(这里没有偏差项)。然而,由于某些原因,该模型未能收敛到正确的值“a”。数据集由我在excel中创建。如下图所示: 下面是我的代码,它试图在我生成的这个虚拟数据集上运行tensorflow import tensorflow as tf import pandas as pd w = tf.Variable([[5]],dtype=tf.float32) b = tf.Variab

我不熟悉机器学习和Tensorflow。目前,我正试图按照教程的逻辑创建一个简单的线性回归模型,形式为y=a*x(这里没有偏差项)。然而,由于某些原因,该模型未能收敛到正确的值“a”。数据集由我在excel中创建。如下图所示:

下面是我的代码,它试图在我生成的这个虚拟数据集上运行tensorflow

import tensorflow as tf
import pandas as pd

w = tf.Variable([[5]],dtype=tf.float32)
b = tf.Variable([-5],dtype=tf.float32)
x = tf.placeholder(shape=(None,1),dtype=tf.float32)
y = tf.add(tf.matmul(x,w),b)

label = tf.placeholder(dtype=tf.float32)
loss = tf.reduce_mean(tf.squared_difference(y,label))

data = pd.read_csv("D:\\dat2.csv")
xs = data.iloc[:,:1].as_matrix()
ys = data.iloc[:,1].as_matrix()
optimizer = tf.train.GradientDescentOptimizer(0.000001).minimize(loss)
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

for i in range(10000):
    sess.run(optimizer,{x:xs,label:ys})
    if i%100 == 0:  print(i,sess.run(w))
print(sess.run(w))
下面是ipython控制台中的打印输出,正如您在第10000次迭代后看到的,w的值约为4.53,而不是正确的值6。 如果有人能告诉我这里到底出了什么问题,我将不胜感激。我玩过不同的学习率,从0.01到0.0000001,没有一个设置能够使w收敛到6。我读过一些关于将特征标准化为标准正态分布的建议,我想知道这种标准化是否必须?如果没有标准化,gradientdescent就无法找到解决方案?多谢各位


这是一个成型问题:y和标签的形状不同(
[batch\u size,1]
vs
[batch\u size]
)。在
loss=tf.reduce_mean(tf.squared_difference(y,label))
中,它会导致tensorflow以不同于您想要的方式解释事物,可能是通过使用一些广播。。。无论如何,结果是你的损失根本不是你想要的

要纠正这一点,只需更换

y = tf.add(tf.matmul(x, w), b)

我的完整工作代码如下:

import tensorflow as tf
import pandas as pd

w = tf.Variable([[4]], dtype=tf.float64)
b = tf.Variable([10.0], dtype=tf.float64, trainable=True)
x = tf.placeholder(shape=(None, 1), dtype=tf.float64)
y = tf.add(tf.matmul(x, w), b)
y = tf.reshape(y, shape=[-1])
label = tf.placeholder(shape=(None), dtype=tf.float64)
loss = tf.reduce_mean(tf.squared_difference(y, label))

my_path = "/media/sf_ShareVM/data2.csv"
data = pd.read_csv(my_path, sep=";")
max_n_samples_to_use = 50
xs = data.iloc[:max_n_samples_to_use, :1].as_matrix()
ys = data.iloc[:max_n_samples_to_use, 1].as_matrix()
lr = 0.000001
optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

for i in range(100000):
    _, loss_value, w_value, b_value, y_val, lab_val = sess.run([optimizer, loss, w, b, y, label], {x: xs, label: ys})
    if i % 100 == 0:  print(i, loss_value, w_value, b_value)
    if (i%2000 == 0 and 0< i < 10000):  # We use a smaller LR at first to avoid exploding gradient. It would be MUCH cleaner to use gradient clipping (by global norm)
        lr*=2
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)

print(sess.run(w))
将tensorflow导入为tf
作为pd进口熊猫
w=tf.Variable([[4]],dtype=tf.float64)
b=tf.Variable([10.0],dtype=tf.float64,trainable=True)
x=tf.placeholder(shape=(无,1),dtype=tf.float64)
y=tf.add(tf.matmul(x,w),b)
y=tf.重塑(y,形状=[-1])
label=tf.placeholder(shape=(无),dtype=tf.float64)
损失=tf.减少平均值(tf.平方差(y,标签))
my_path=“/media/sf_ShareVM/data2.csv”
data=pd.read_csv(我的路径,sep=“;”)
要使用的最大样本数=50
xs=data.iloc[:max_n_samples_to_use,:1].as_matrix()
ys=data.iloc[:max\u n\u samples\u to\u use,1].as\u matrix()
lr=0.000001
优化器=tf.train.GradientDescentOptimizer(学习率=lr)。最小化(损失)
sess=tf.InteractiveSession()
sess.run(tf.global\u variables\u initializer())
对于范围内的i(100000):
_,loss_value,w_value,b_value,y_val,lab_val=sess.run([optimizer,loss,w,b,y,label],{x:xs,label:ys})
如果i%100==0:打印(i,损耗值,w值,b值)
如果(i%2000==0和0
如果
randtween
通过了0到0.1而不是-2,2怎么办?你的学习率太低了。你有多少不同的价值观?(excel中有多少行?)。如果这个数字太小,那可能是个问题。。。如果您有足够的数据(并且范围足够大)@gdelab数据集包含大约160个数据点,那么您应该能够在不进行任何规范化的情况下进行收敛。我玩过更高的学习率,比如0.1甚至1,但没有用。我认为通过迭代10000次,模型在经过更多测试后仍然能够收敛,问题在于损失函数(即使在较小的数据集上,它也没有给出它应该给出的值),我仍然不知道确切的位置。然后,通过减少w和增加b,优化确实使损失最小化。也许是y或标签的形状问题导致了广播或sthg之类的…你会看到,在前几个非常好的步骤之后,它收敛得非常慢(尤其是偏差)。要解决这个问题,我们需要更高的学习率。不幸的是,我们在这里是在爆炸梯度的边界,特别是如果你从你的数据中保留所有的值,这就是为什么我们需要一个小的学习率。理想情况下,你应该剪裁渐变并使用更高的学习率。谢谢@gdelab,这确实是塑造问题。一旦固定,模型会很快收敛到正确的值。谢谢
import tensorflow as tf
import pandas as pd

w = tf.Variable([[4]], dtype=tf.float64)
b = tf.Variable([10.0], dtype=tf.float64, trainable=True)
x = tf.placeholder(shape=(None, 1), dtype=tf.float64)
y = tf.add(tf.matmul(x, w), b)
y = tf.reshape(y, shape=[-1])
label = tf.placeholder(shape=(None), dtype=tf.float64)
loss = tf.reduce_mean(tf.squared_difference(y, label))

my_path = "/media/sf_ShareVM/data2.csv"
data = pd.read_csv(my_path, sep=";")
max_n_samples_to_use = 50
xs = data.iloc[:max_n_samples_to_use, :1].as_matrix()
ys = data.iloc[:max_n_samples_to_use, 1].as_matrix()
lr = 0.000001
optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

for i in range(100000):
    _, loss_value, w_value, b_value, y_val, lab_val = sess.run([optimizer, loss, w, b, y, label], {x: xs, label: ys})
    if i % 100 == 0:  print(i, loss_value, w_value, b_value)
    if (i%2000 == 0 and 0< i < 10000):  # We use a smaller LR at first to avoid exploding gradient. It would be MUCH cleaner to use gradient clipping (by global norm)
        lr*=2
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)

print(sess.run(w))