我是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
答案 0 :(得分:0)
这里有一些你可以改进的东西,但是你通过降低学习率大部分都在正确的轨道上。你注意到0.5的学习率太大了。考虑一下你的权重都是1.0(我稍后会遇到一个问题)我猜最初的预测也是2.0,你的错误大约是200^2
每个样本。这将产生一个大梯度。
所以第一个问题是标签的数值稳定性。将标签保持为合理的小数字通常是个好主意。如果网络需要预测较大的值,则权重需要很大,并且会导致预测中的不适合学习的波动。您可以将所有标签缩小,方法是将它们全部除以200,然后在做出预测后重新调整它们。
接下来你将你的权重初始化为一个常数,相同的常数,这是一篇文章,讨论你为什么不应该这样做:
将权重设置为随机初始值。例如,取自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}))
这不会影响您的结果,但您不需要两次运行正向计算。