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

Posted

技术标签:

【中文标题】训练的 Tensorflow CNN 回归 MSE 高于测试【英文标题】:Tensorflow CNN regression MSE higher for train than test 【发布时间】:2018-09-26 01:02:56 【问题描述】:

我正在向 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】:

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

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

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

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

【讨论】:

我在这里上传了模型:github.com/toemm/TF-CNN-regression/blob/master/BA-CNN_so.ipynb(之前发错了,抱歉)。目前实现了您的解决方案并在单元格 [13] 中运行它。您可以看到这种奇怪的行为,似乎火车损失和测试损失被翻转了。这可能与您提到的洗牌或initialize_datasets(...) fn 有关。我在这里迷路了,再次感谢您查看此内容! :) @ivan 请减少迭代次数并打印整个epoch_train_losses列表 我已经在上述链接的单元格 [19] 中完成了该操作。分布似乎很好,嗯。 同意,看起来一致。能否进一步输出trainYtestY的分布 已更新。细胞 [8]、[10]。这些由train_test_split(...)(来自sklearn.model_selection.train_test_split)洗牌。此外,通过此调用 dataset_train = dataset_train.apply(tf.contrib.data.shuffle_and_repeat(...)) 或至少应该如此,数据集再次在 initialize_datasets(...) 中混洗。

以上是关于训练的 Tensorflow CNN 回归 MSE 高于测试的主要内容,如果未能解决你的问题,请参考以下文章

DL之LSTM/GRU/CNN:基于tensorflow框架分别利用LSTM/GRUCNN算法对上海最高气温实现回归预测案例

为啥与 MSE 相比,使用 MAE 标准训练随机森林回归器如此缓慢?

Tensorflow 上带有回归输出的 CNN 图像识别

使用 Keras 和 Tensorflow 进行回归的否定结果

使用预训练 (Tensorflow) CNN 提取特征

CNN训练错误执行Tensorflow Python以识别狗和猫的图像