【问题标题】:Restarting learning process from scratch for best results?从头开始学习过程以获得最佳效果?
【发布时间】:2019-12-16 15:33:36
【问题描述】:

我对深度学习比较陌生,刚刚开始修改一些简单的小模型,在本例中是一个小的 unet,基本上是从 https://github.com/zhixuhao/unet/blob/master/trainUnet.ipynb 复制粘贴的

我发现在我的大部分运行中,我都会达到一定的损失水平,从那时起它不想进一步收敛。然而,每隔一段时间我从头开始重新开始学习过程,它突然收敛到比上面提到的高原低 1000 倍左右的损失......最终的模型相当出色 - 没有抱怨,但每个人都必须重新开始学了那么多遍?

我知道这可能是由于随机分配模型的初始权重。我提高了学习率并减小了批量大小以尝试逃避局部最小值,但这似乎没有太大帮助。

一遍又一遍地重新启动模型是常见的做法吗?

【问题讨论】:

    标签: tensorflow keras deep-learning image-segmentation unity3d-unet


    【解决方案1】:

    无论模型训练多长时间,在不同的运行中看到少量方差都​​是很正常的,尽管不是你看到的幅度。

    损失的减少是否真的反映在测试集的准确率上?损失可能是一个有用的衡量标准,但至少根据我的经验,损失和准确性(或您感兴趣的任何指标)通常只是松散相关。我观察到异常高的训练准确率/低训练损失通常会导致模型泛化能力差。

    损失情况并不总是朝着全球最低标准平滑,您的情况可能有两个不同的山谷。 H Li 等人的这篇论文是关于该主题的非常有趣的读物: Visualizing the Loss Landscape of Neural Nets

    总而言之,特征重用和正则化可以极大地帮助创建朝向最小值的平滑梯度。

    您可能还想研究学习率策略,以尝试让您的模型进入损失情况更平滑的区域。我会推荐 Leslie Smith 的 One-Cycle Policy。总体思路是提高学习率并降低动量以使您的模型进入全局最小值区域(并沿途跳过局部最小值),然后降低学习率以使模型落入最小值。

    【讨论】:

    • 谢谢您,非常值得考虑。我会回去重新检查模型的泛化程度——以及研究可变学习率。在我的问题中,分割结果(就每个图像的像素而言)很小,因此类之间存在相当大的差异。因此,可能有两个谷底——包括一个真和一个“假”最小值,其中模型只为任何输入生成黑色蒙版。我没有进一步收敛的模型实际上似乎属于后一类。尝试了不同的自定义损失计算方法,但这并没有太大帮助。
    • 我还没有专门做分割方面的工作,但是如果模型可以通过猜测一个全黑的掩码得到 99% 的准确率,那几乎肯定是问题所在。你实际上得到的是一个不平衡的阶级问题。其他人可能会建议一种方法来调整您的预测和标签以提供更强的学习信号。我想这涉及忽略足够多的黑色像素,以至于您的 TP/TN 大致相等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多