我正在学习 TensorFlow 并尝试将其应用于简单的线性回归问题。data是形状 [42x2] 的 numpy.ndarray。
我有点困惑,为什么在每个连续的 epoch 之后损失都在增加。预计每一个连续的时期损失都会下降吗!
这是我的代码(如果您希望我也分享输出,请告诉我!):(非常感谢您花时间回答它。)
1) 为因变量/自变量创建占位符
X = tf.placeholder(tf.float32, name='X')
Y = tf.placeholder(tf.float32,name='Y')
Run Code Online (Sandbox Code Playgroud)
2) 为权重、偏差、total_loss 创建变量(在每个 epoch 之后)
w = tf.Variable(0.0,name='weights')
b = tf.Variable(0.0,name='bias')
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
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())
Run Code Online (Sandbox Code Playgroud)
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]})))
Run Code Online (Sandbox Code Playgroud)
干杯!
简短的回答是你的学习率太大了。通过将其从 0.001 更改为 0.0001,我能够获得合理的结果,但是我只使用了您倒数第二条评论中的 23 分(我最初没有注意到您的最后一条评论),因此使用所有数据可能需要更低的数字。
0.001 似乎是一个非常低的学习率。但是,真正的问题是您的损失函数正在使用reduce_sum而不是reduce_mean。这会导致您的损失很大,这会向 GradientDescentOptimizer 发送非常强的信号,因此尽管学习率较低,但它还是会过冲。如果您在训练数据中添加更多点,问题只会变得更糟。因此,用于reduce_mean获得平均平方误差,您的算法将表现得更好。
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |