【发布时间】: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 时没有遇到这个问题。这是因为实现的不同吗?
【问题讨论】:
-
您能否提供一个带有数据的示例代码,以便我重现它?