Tensorflow CNN回归MSE高于列车而不是测试

时间:2018-04-16 10:12:35

标签: python tensorflow machine-learning deep-learning regression

我正在向CNN提供图片以预测回归设置中的值。

Input: [NUM_EXAMPLES, HEIGHT, WIDTH, CHANNELS] -> [NUM_EXAMPLES, YPRED]

这是损失:loss = tf.reduce_mean(tf.squared_difference(Ypreds, labels))

训练循环:

Loop { 
    for i in range(EPOCHS):
        epoch_train_loss = 0

        for k in range(NUM_BATCHES):
            _, batch_loss = sess.run([train_step, loss], feed_dict={...})
            epoch_train_loss += (batch_loss/NUM_BATCHES)

        # calculate test loss after 1 epoch and log
        epoch_test_loss = sess.run(loss, feed_dict={...})

        # print train and test loss after 1 epoch
        print(epoch_train_loss, epoch_test_loss)
}

这些是记录结果:

Epoch: 0 (8.21s), Train-Loss: 12844071, Test-Loss: 3802676
Epoch: 1 (4.94s), Train-Loss: 3691994, Test-Loss: 3562206
Epoch: 2 (4.90s), Train-Loss: 3315438, Test-Loss: 2968338
Epoch: 3 (5.00s), Train-Loss: 1841562, Test-Loss: 417192
Epoch: 4 (4.94s), Train-Loss: 164503, Test-Loss: 3531
Epoch: 5 (4.94s), Train-Loss: 97477, Test-Loss: 1843
Epoch: 6 (4.98s), Train-Loss: 96474, Test-Loss: 4676
Epoch: 7 (4.94s), Train-Loss: 89613, Test-Loss: 1080
  • 这对我来说没有任何意义,因为火车损失大于测试损失而且永远不会发生。

  • 我是否正确计算了这些值?损失按批次大小平均,并将批次损失除以NUM_BATCHES,我应得到可比较的结果。

1 个答案:

答案 0 :(得分:1)

您的代码似乎很好,但我的方式有点不同:

epoch_train_losses = []
for k in range(NUM_BATCHES):
    _, batch_loss = sess.run([train_step, loss], feed_dict={...})
    epoch_train_losses.append(batch_loss)
epoch_train_loss = np.mean(epoch_train_losses)
# print `epoch_train_loss` and `epoch_train_losses` too

完全分配损失而不是单个数字(均值)可以帮助您详细检查发生的情况。

以下是一种可能的解释:训练和测试集未正确改组,因此测试集有效地模仿训练集的部分(或者甚至可以 >训练集的一部分)。在这种情况下,不同批次的培训损失分布将有很大的差异:一些损失将与报告的测试损失相当,一些损失将更高,拉平均值。