Skip to main content
 首页 » 编程设计

python之训练的 Tensorflow CNN 回归 MSE 高于测试

2025年01月19日26soundcode

我正在向 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 我应该得到可比较的结果。

请您参考如下方法:

你的代码看起来不错,但我会做一些不同的事情:

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 

获取损失的完整分布而不是单个数字(平均值)可以帮助您详细检查发生了什么。

这是一种可能的解释:训练集和测试集没有正确打乱,因此测试集有效地模仿了训练集的一部分(或者甚至可以> 训练集的一部分)。在这种情况下,跨批处理的训练损失分布将具有非常高的方差:一些损失将与报告的测试损失相当,一些损失将高得多,从而拉高均值。