【问题标题】:Tensorflow Linear model errorTensorflow 线性模型错误
【发布时间】:2018-04-09 19:45:50
【问题描述】:

我是 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

【问题讨论】:

标签: python pandas tensorflow linear-regression


【解决方案1】:

您可以在此处改进一些事情,但通过降低学习率,您大部分都在正确的轨道上。正如您所注意到的,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}))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2018-07-24
    • 1970-01-01
    • 2018-08-30
    • 2016-09-06
    • 2021-04-12
    相关资源
    最近更新 更多