【问题标题】:[MXNet]Periodic Loss Value when training with "step" learning rate policy[MXNet]使用“步进”学习率策略进行训练时的周期性损失值
【发布时间】:2017-10-12 07:51:37
【问题描述】:

在训练深度 CNN 时,一种常见的方法是使用 SGD 和具有“阶梯”学习率策略的动量(例如,在不同阶段的学习率设置为 0.1,0.01,0.001..训练)。但是我在 MXNet 下用这个策略训练时遇到了一个意想不到的现象。

即周期性训练损失值 https://user-images.githubusercontent.com/26757001/31327825-356401b6-ad04-11e7-9aeb-3f690bc50df2.png

以上是固定学习率 0.01 下的训练损失,其中损失正常减少 https://user-images.githubusercontent.com/26757001/31327872-8093c3c4-ad04-11e7-8fbd-327b3916b278.png

但是,在训练的第二阶段(lr 0.001),loss周期性地上下波动,周期正好是一个epoch

所以我认为这可能是数据洗牌的问题,但它无法解释为什么它不会在第一阶段发生。其实我用ImageRecordIter作为DataIter并在每个epoch之后重置它,有没有我遗漏或设置错误的地方?

train_iter = mx.io.ImageRecordIter(
    path_imgrec=recPath,
    data_shape=dataShape,
    batch_size=batchSize,
    last_batch_handle='discard',
    shuffle=True,
    rand_crop=True,
    rand_mirror=True)

训练和损失评估的代码:

while True:
    train_iter.reset()
    for i,databatch in enumerate(train_iter):
                globalIter += 1
        mod.forward(databatch,is_train=True)
        mod.update_metric(metric,databatch.label)
        if globalIter % 100 == 0:
                    loss = metric.get()[1]
                    metric.reset()
                mod.backward()
                mod.update()

其实loss是可以收敛的,只是耗时太长。 在不同的网络和不同的数据集上,我长期遭受这个问题的困扰。 我在使用 Caffe 时没有遇到这个问题。这是因为实现的不同吗?

【问题讨论】:

  • 您能否提供一个带有数据的示例代码,以便我重现它?

标签: mxnet loss


【解决方案1】:

您的损失/学习曲线看起来非常平滑,我相信即使在较小的相对比例下将学习率设置为 0.01(即,如果您“放大”图表),您也可以观察到相同的损失波动你会看到相同的模式)。例如,您的数据迭代器可能会遇到传递同一批次的问题。而且您的训练循环看起来有问题,但这可能是由于格式设置造成的(例如 mod.update() 仅每 100 批执行一次是不正确的)。

当您穿过损失表面的山谷时,您可以观察到损失的周期性,在两侧而不是在山谷中上下。选择较低的学习率有助于解决此问题,并确保您也使用了动量。

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 2018-10-25
    • 2019-05-22
    • 2018-06-21
    • 2018-04-12
    • 1970-01-01
    • 2022-10-18
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多