【问题标题】:Possible explanations for loss increasing?损失增加的可能解释?
【发布时间】:2017-02-13 14:26:37
【问题描述】:

我有来自四个不同国家/地区的 40k 图像数据集。这些图像包含多种主题:户外场景、城市场景、菜单等。我想使用深度学习对图像进行地理标记。

我从一个包含 3 个 conv->relu->pool 层的小型网络开始,然后再添加 3 个来加深网络,因为学习任务并不简单。

我的损失是这样做(使用 3 层和 6 层网络):

损失实际上开始有点平稳并下降了几百步,但随后开始缓慢上升。

我的损失增加的可能原因是什么?

我的初始学习率设置得很低:1e-6,但我也尝试过 1e-3|4|5。我已经对具有不同主题的两个类别的小型数据集的网络设计进行了健全性检查,并且损失根据需要不断下降。训练准确率徘徊在 ~40%

【问题讨论】:

    标签: tensorflow deep-learning convolution tensorboard cross-entropy


    【解决方案1】:

    我通常会说你的学习率太高了,但看起来你已经排除了这一点。您应该检查进出图层的数字的大小。您可以使用 tf.Print 来执行此操作。也许你不小心输入了黑色图像,或者你可以找到数字疯狂的图层。

    另外你是如何计算交叉熵的?您可能希望在日志中添加一个小 epsilon,因为当其输入接近零时,它的值将变为无穷大。或者更好的是使用 tf.nn.sparse_softmax_cross_entropy_with_logits(...) 函数来为您处理数值稳定性。

    由于您的交叉熵的成本如此之高,听起来网络输出几乎全为零(或接近零的值)。由于您没有发布任何代码,我不能说为什么。我认为您可能只是偶然将成本函数计算中的某些内容归零。

    【讨论】:

    • 我正在使用tf.nn.sparse_softmax_cross_entropy_with_logits(...)FYI。
    • 我猜你可能是。否则成本会变成无穷大,你会得到一个 nan。由于某种原因,输出肯定会全部为零。也许尝试使用 elu 激活而不是 relu,因为它们不会在零处死。
    • 我在我的 conv 层中使用 tf.nn.elus 并在最终隐藏层中使用 relu:hidden = tf.nn.relu(tf.matmul(reshape, fc1_weights) + fc1_biases)。也许我也可以在那里试试 elu。
    • 你不需要在最后一层激活,因为 softmax 函数是一个激活。还要确保使用正值和负值初始化权重。
    • 它甚至更强大一些 - 你绝对不希望在最后一层使用 relus,你希望 logits 能够转到任意负值。
    【解决方案2】:

    我也遇到了这个问题,我使用的是 keras 库(tensorflow 后端)

        Epoch 00034: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-34-0.627.hdf50
    Epoch 35/150
    226160/226160 [==============================] - 65s 287us/step - loss: 0.2870 - acc: 0.9331 - val_loss: 2.7904 - val_acc: 0.6193
    Epoch 36/150
    226160/226160 [==============================] - 65s 288us/step - loss: 0.2813 - acc: 0.9331 - val_loss: 2.7907 - val_acc: 0.6268
    
    Epoch 00036: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-36-0.627.hdf50
    Epoch 37/150
    226160/226160 [==============================] - 65s 286us/step - loss: 0.2910 - acc: 0.9330 - val_loss: 2.5704 - val_acc: 0.6327
    Epoch 38/150
    226160/226160 [==============================] - 65s 287us/step - loss: 0.2982 - acc: 0.9321 - val_loss: 2.5147 - val_acc: 0.6415
    
    Epoch 00038: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-38-0.642.hdf50
    Epoch 39/150
    226160/226160 [==============================] - 68s 301us/step - loss: 0.2968 - acc: 0.9318 - val_loss: 2.7375 - val_acc: 0.6409
    Epoch 40/150
    226160/226160 [==============================] - 68s 299us/step - loss: 0.3124 - acc: 0.9298 - val_loss: 2.8359 - val_acc: 0.6047
    
    Epoch 00040: saving model to /home/ubuntu/temp/trained_data1/final_dev/final_weights-improvement-40-0.605.hdf50
    Epoch 41/150
    226160/226160 [==============================] - 65s 287us/step - loss: 0.2945 - acc: 0.9315 - val_loss: 3.5825 - val_acc: 0.5321
    Epoch 42/150
    226160/226160 [==============================] - 65s 287us/step - loss: 0.3214 - acc: 0.9278 - val_loss: 2.5816 - val_acc: 0.6444
    

    当我看到我的模型时,模型由太多的神经元组成, 简而言之,模型过度拟合。 我减少了 2 个密集层中的神经元数量(从 300 个神经元减少到 200 个神经元)

    【讨论】:

    • 过拟合不会使训练损失增加,而是指训练损失减小到一个很小的值,而验证损失仍然很高的情况。
    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2018-05-08
    • 2018-04-25
    • 1970-01-01
    • 2018-12-15
    • 2020-11-18
    相关资源
    最近更新 更多