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

标签 python machine-learning tensorflow linear-regression gradient-descent

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

enter image description here

这是我的代码,尝试在我生成的虚拟数据集上运行 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。我读过一些建议将特征标准化为标准正态分布,我想知道这种标准化是否有效必须的?如果没有归一化,梯度下降就无法找到解决方案吗?非常感谢!

enter image description here

最佳答案

这是一个整形问题: y 和标签没有相同的形状( [batch_size, 1][batch_size] )。在 loss = tf.reduce_mean(tf.squared_difference(y, label)) ,它会导致tensorflow对事物的解释与你想要的不同,可能是通过使用一些广播......无论如何,结果是你的损失根本不是你想要的。

要纠正这个问题,只需替换

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

y = tf.add(tf.matmul(x, w), b)
y = tf.reshape(y, shape=[-1])

我的完整工作代码如下:

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))

关于python - 简单线性回归在 tensorflow 中未能收敛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44886757/

相关文章:

machine-learning - 神经网络无法识别基本输入模式

python - 当 RMSLE 是 eval 指标时,lightgbm 的提前停止不起作用

python - 如何在 Python 中存储 azure.eventhub.common.Offset?

python - key 错误 : "Unable to open object (object ' imgs' doesn't exist)"

machine-learning - 如何合并/组合或附加 Tensorboard 文件?

python - 如何使用 `input_fn` 和 `read_batch_examples` 设置来创建 `num_epochs`?

tensorflow - 在一对一样本上训练 Keras 模型并绘制验证曲线

python - ListCtrl 中的自定义 header 组织或 wxPython 中的另一个小部件

Python:绘制时间增量和累积值

python - 不能多次在 Flask-wtf 中附加_entry FieldList