Tensorboard显示不同的均方值

时间:2017-12-12 16:06:37

标签: tensorflow tensorboard

我试图在Tensorboard中可视化简单的线性回归。下面是代码。但是我在控制台中看到的值与张量板图中显示的值完全不匹配。

tf.reset_default_graph()
X = tf.placeholder(dtype=tf.float32, shape=(None, n+1), name="X")
y = tf.placeholder(dtype=tf.float32, shape=(None, 1), name="y")
theta = tf.Variable(tf.random_uniform([n+1, batch_size], -1.0, 1.0), name="theta")
global_step = tf.Variable(0,name='global_step',trainable=False)
y_pred = tf.matmul(X, theta, name="predictions")
error = y_pred - y
mse = tf.reduce_mean(tf.square(error), name='mse')
optimizer = tf.train.AdadeltaOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(mse, global_step=global_step)
mse_summary = tf.summary.scalar('MSE', mse)
summary_op = tf.summary.merge_all()
file_writer = tf.summary.FileWriter(logdir, tf.get_default_graph())


init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
saver = tf.train.Saver()

with tf.Session() as sess:    
    sess.run(init)    
    for epoch in range(1, n_epochs):
        for batch_index in range(n_batches):
            X_batch, y_batch= fetch_batch(epoch, batch_index, batch_size)
            if batch_index % 50 == 0 and batch_index != 0:
                _,summary_str = sess.run([training_op, summary_op],feed_dict={X:X_batch, y:y_batch})
                file_writer.add_summary(summary_str, global_step=tf.train.global_step(sess, global_step))
            sess.run(training_op, feed_dict={X:X_batch, y:y_batch})
        if epoch % 100 == 0:
            print("Epoch", epoch, "MSE", sess.run(mse, feed_dict={X:X_batch, y:y_batch})            
    best_theta = theta.eval()   
    file_writer.close()

在控制台中,我收到以下消息:

Epoch 100 MSE 2.42409
Epoch 200 MSE 2.28097
Epoch 300 MSE 2.14192
Epoch 400 MSE 2.00997
Epoch 500 MSE 1.88537
Epoch 600 MSE 1.76792
Epoch 700 MSE 1.65733
Epoch 800 MSE 1.55331
Epoch 900 MSE 1.45556
model saved at step= 167832

和run的张量标量图是 enter image description here

我能够解释的是MSE的值从6. *到4. *。或者也许我在可视化中遗漏了一些东西。在最后一个时期,即1.4或甚至在第100个时期2.42,我无法看到任何地方附近的曲线。

请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:2)

以下是您在伪代码中所做的事情:

Load stuff
Initialise model
Begin EPOCH loop
    Begin BATCH loop
        Do training ops
        Store summary at intervals
    End BATCH loop
    Print MSE for an EPOCH
End EPOCH loop

您正在混淆EPOCH和BATCH结果。因此,您可以显示批处理结果,但打印Epoch结果。

每个纪元的MSE可以与批次的MSE不同。对每50个批次步骤计算批次MSE。但是Epoch MSE是在所有批量训练操作完成后计算出来的。

因此,纪元MSE结果取决于批次训练操作的全部之后模型会发生什么。最终批次MSE 可能类似于纪元MSE,但情况并非总是如此。

尝试这样的代码,看看你得到了什么结果(我可能在语法上犯了一个错误,但你看到我得到了什么)

if epoch % 100 == 0:
    print("Epoch", epoch, "MSE", sess.run(mse, feed_dict={X:X_batch, y:y_batch})
    _,summary_str = sess.run(summary_op,feed_dict={X:X_batch, y:y_batch})
    file_writer.add_summary(summary_str, global_step=tf.train.global_step(sess, global_step))

有关数据集的说明:

使用单独的数据集进行培训(批量培训操作)和测试(时期结果)。不要重复使用批处理培训数据来测试模型。此外,您只是对模型已经过训练的相同数据进行重新测试。它没有在“新”场景中进行测试......这并没有告诉你任何有用的东西,并且可能导致过度拟合。