Tensorflow线性模型错误

时间:2018-04-09 19:45:50

标签: python pandas tensorflow linear-regression

我是tensorflow环境的新手,我在Jupyter-notebook中编写了这段代码,并且损失功能正在迅速增加。

我使用梯度下降作为0.05的优化器和学习率。 如果学习率更改为0.0000005,则损失大约为101.82

----------------------------------------------- -------------------

我不知道该怎么做。

 import pandas as pd

import matplotlib.pyplot as plt

import tensorflow as tf

from __future__ import division

x = tf.placeholder(tf.float32)

#x = tf.placeholder(tf.float32)

y  = tf.placeholder(tf.float32)

b = tf.Variable([1.0], tf.float32)

w1 = tf.Variable([1.0], tf.float32)

init = tf.Session()

​

lin_mod = w1 * x + b

squared_delta = tf.square(lin_mod - y)

loss = tf.reduce_sum(squared_delta)

my_opt = tf.train.GradientDescentOptimizer(0.05)

train = my_opt.minimize(loss)

x_train = [

237,

    229.5,

    232.45,

    207.4,

    205.65,

    207.3,

    ]

    ]

    y_train = [237,

    230,

    233,

    207.2,

    208.9,

    207.5,

 ]

sess = tf.Session()

init = tf.global_variables_initializer()

sess.run(init)

for i in range(100):

    print(sess.run(train, {x:x_train, y:y_train}))

    print(sess.run(loss, {x:x_train, y:y_train}))

None
209335760000.0
None
8.30988e+21
None
3.298725e+32
None
inf
Non

1 个答案:

答案 0 :(得分:0)

这里有一些你可以改进的东西,但是你通过降低学习率大部分都在正确的轨道上。你注意到0.5的学习率太大了。考虑一下你的权重都是1.0(我稍后会遇到一个问题)我猜最初的预测也是2.0,你的错误大约是200^2每个样本。这将产生一个大梯度。

所以第一个问题是标签的数值稳定性。将标签保持为合理的小数字通常是个好主意。如果网络需要预测较大的值,则权重需要很大,并且会导致预测中的不适合学习的波动。您可以将所有标签缩小,方法是将它们全部除以200,然后在做出预测后重新调整它们。

接下来你将你的权重初始化为一个常数,相同的常数,这是一篇文章,讨论你为什么不应该这样做:

https://stats.stackexchange.com/questions/27112/danger-of-setting-all-initial-weights-to-zero-in-backpropagation

将权重设置为随机初始值。例如,取自tensorflow文档(https://www.tensorflow.org/versions/r1.0/programmers_guide/variables):

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")

最后请注意,您可以压缩这些行:

for i in range(100):
  print(sess.run(train, {x:x_train, y:y_train}))
  print(sess.run(loss, {x:x_train, y:y_train}))

进入这个:

for i in range(100):
  print(sess.run([train, loss], {x:x_train, y:y_train}))

这不会影响您的结果,但您不需要两次运行正向计算。