我正在学习TensorFlow并尝试将其应用于简单的线性回归问题。 data
是numpy.ndarray的形状[42x2]。
我有点疑惑为什么在每个成功的时代之后,损失正在增加。预计每一连续的时期都不会有损失!
这是我的代码(请告诉我,如果您希望我也分享输出!):(非常感谢您花时间回答它。)
1)创建了依赖/自变量的占位符
X = tf.placeholder(tf.float32, name='X')
Y = tf.placeholder(tf.float32,name='Y')
2)为重量,偏见,total_loss(每个时代之后)创建了变量
w = tf.Variable(0.0,name='weights')
b = tf.Variable(0.0,name='bias')
3)定义损失函数&优化
Y_pred = X * w + b
loss = tf.reduce_sum(tf.square(Y - Y_pred), name = 'loss')
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.001).minimize(loss)
4)创建了摘要事件&事件文件编写者
tf.summary.scalar(name = 'weight', tensor = w)
tf.summary.scalar(name = 'bias', tensor = b)
tf.summary.scalar(name = 'loss', tensor = loss)
merged = tf.summary.merge_all()
evt_file = tf.summary.FileWriter('def_g')
evt_file.add_graph(tf.get_default_graph())
5)并在会话中执行所有
with tf.Session() as sess1:
sess1.run(tf.variables_initializer(tf.global_variables()))
for epoch in range(10):
summary, _,l = sess1.run([merged,optimizer,loss],feed_dict={X:data[:,0],Y:data[:,1]})
evt_file.add_summary(summary,epoch+1)
evt_file.flush()
print(" new_loss: {}".format(sess1.run(loss,feed_dict={X:data[:,0],Y:data[:,1]})))
干杯!
答案 0 :(得分:2)
简短的回答是你的学习率太高了。通过将其从0.001更改为0.0001,我能够获得合理的结果,但我只使用了您的倒数第二条评论中的23分(我最初没有注意到您的上一条评论),因此使用所有数据可能需要更低的数字。
0.001似乎是一个非常低的学习率。但是,真正的问题是您的丢失功能使用的是reduce_sum
而不是reduce_mean
。这会导致您的丢失数量很大,这会向GradientDescentOptimizer发送一个非常强大的信号,因此尽管学习率很低,但它仍会超调。如果您在训练数据中添加更多分数,问题就会变得更糟。因此,使用reduce_mean
来获得平均误差,您的算法会表现得更好。