我正在学习TensorFlow,并试图将其应用于一个简单的线性回归问题。 data
是形状 [42x2] 的 numpy.ndarray 。
我有点困惑,为什么在每个成功时代之后,损失都会增加。难道损失不会随着每个连续的时代而减少吗!
这是我的代码(让我知道,如果你想让我也分享输出!): (非常感谢您抽出宝贵时间回答它。
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.001 更改为 0.0001 来获得合理的结果,但我只使用了您倒数第二条评论中的 23 点(我最初没有注意到您的最后一条评论),因此使用所有数据可能需要更低的数字。
0.001 似乎是一个非常低的学习率。 但是,真正的问题是您的损失函数使用的是reduce_sum
而不是reduce_mean
。 这会导致您的损失是一个很大的数字,这会向GradientDescentOptimizer发送非常强的信号,因此尽管学习率很低,但它还是超调了。 如果向训练数据添加更多点,问题只会变得更糟。 因此,使用reduce_mean
来获得平均平方误差,您的算法将表现得更好。