【发布时间】:2017-07-08 21:41:10
【问题描述】:
我在这里阅读了其他几篇关于在训练/验证损失上获得 nan 时该怎么做的文章。我假设我的问题是我的学习率没有足够的衰减,但我想知道是否有人可以看看并同意/不同意。
我正在关注精彩的博文 here,但在 tensorflow 中实现。转换模型相当容易,但动量和学习率有点棘手,我认为这就是问题所在。我遇到的问题是,在损失上升到 nan 之前,我只能走这么多时代。我使用的模型应该相当于博客教程中的net4/5。
... Epoch /Time/Train Loss/Valid Loss/Learn Rate
Epoch[ 900]0:14:11 0.000116 0.001566 0.027701
Epoch[ 910]0:14:20 0.000107 0.001565 0.026593
Epoch[ 920]0:14:29 0.000098 0.001564 0.026593
Epoch[ 930]0:14:39 0.000088 0.001567 0.026593
Epoch[ 940]0:14:48 0.000080 0.001567 0.026593
Epoch[ 950]0:14:58 0.000069 0.001578 0.026593
Epoch[ 960]0:15: 7 0.000072 0.001600 0.026593
Epoch[ 970]0:15:17 0.000105 0.001664 0.026593
Epoch[ 980]0:15:26 0.000221 0.001799 0.026593
Epoch[ 990]0:15:35 0.000456 0.002045 0.026593
Epoch[1000]0:15:45 0.000955 0.002473 0.025530
Epoch[1010]0:15:54 0.002148 0.003415 0.025530
Epoch[1020]0:16: 4 0.008455 0.009337 0.025530
Epoch[1030]0:16:13 0.009042 0.010412 0.025530
Epoch[1040]0:16:22 nan nan 0.025530
所以我已经看到了,这似乎只是需要在那时降低学习率的情况。它与教程数字不匹配,但令人担忧。
博文中的下一步是添加 dropout。我已经在模型中实现了它,我只是传递一个张量布尔值来告诉它是否训练。因此,启用 dropout 后,我在 150 个时期内得到了 nans,但我不确定问题出在哪里。因为它应该是规范系统,所以我没想到会发生这种情况。
... Epoch /Time/Train Loss/Valid Loss/Learn Rate
Epoch[ 0]0: 0: 1 0.025211 0.025614 0.045000
Epoch[ 10]0: 0:11 0.003496 0.004075 0.045000
Epoch[ 20]0: 0:22 0.003202 0.003742 0.045000
Epoch[ 30]0: 0:32 0.003169 0.003712 0.045000
Epoch[ 40]0: 0:42 0.003084 0.003605 0.045000
Epoch[ 50]0: 0:53 0.002976 0.003507 0.045000
Epoch[ 60]0: 1: 3 0.002891 0.003437 0.045000
Epoch[ 70]0: 1:14 0.002795 0.003381 0.045000
Epoch[ 80]0: 1:24 0.002648 0.003317 0.045000
Epoch[ 90]0: 1:34 0.002408 0.003181 0.011250
Epoch[ 100]0: 1:45 0.002267 0.003107 0.011250
Epoch[ 110]0: 1:55 0.001947 0.003003 0.011250
Epoch[ 120]0: 2: 6 0.004507 0.005768 0.011250
Epoch[ 130]0: 2:16 nan nan 0.011250
对于启用 dropout 可能会出现什么问题有什么想法吗?我已经建立了完全相同的模型 afaik,尽管即使没有 nan 问题,我的损失也没有那么好。
编辑:
所以我的卷积层设置不正确。我已经阅读了有这个的教程。
InputLayer (None, 1, 96, 96) produces 9216 outputs
Conv2DCCLayer (None, 32, 94, 94) produces 282752 outputs
MaxPool2DCCLayer (None, 32, 47, 47) produces 70688 outputs
Conv2DCCLayer (None, 64, 46, 46) produces 135424 outputs
MaxPool2DCCLayer (None, 64, 23, 23) produces 33856 outputs
Conv2DCCLayer (None, 128, 22, 22) produces 61952 outputs
MaxPool2DCCLayer (None, 128, 11, 11) produces 15488 outputs
DenseLayer (None, 500) produces 500 outputs
DenseLayer (None, 500) produces 500 outputs
DenseLayer (None, 30) produces 30 outputs
我刚刚更新了我的,所以我认为它现在是一样的。
conv: input size: (?, 96, 96, 1)
pool: input size: (?, 94, 94, 32)
conv: input size: (?, 47, 47, 32)
pool: input size: (?, 46, 46, 64)
conv: input size: (?, 23, 23, 64)
pool: input size: (?, 22, 22, 128)
fc: input size before flattening: (?, 11, 11, 128)
fc: input size: (?, 15488)
fc: input size: (?, 500)
fc: input size: (?, 500)
out: (?, 30)
仍然无法正常工作。在卷积层和第一个完全连接的层上启用 dropout 后,模型会持续 50 个 epoch 以下,然后错误就会越过屋顶。即使学习率非常小,问题仍然存在。
Epoch[ 0]0: 0: 1 0.029732 0.030537 0.030000
Epoch[ 10]0: 0:11 0.004211 0.004986 0.030000
Epoch[ 20]0: 0:20 0.003013 0.003530 0.004500
Epoch[ 30]0: 0:30 5.250690 5.426279 0.004500
Epoch[ 40]0: 0:40 nan nan 0.000675
而且看起来非 dropout 方法被破坏并做同样的事情 >_>...
编辑:我想我已经解决了这个问题。我正在使用一种动量优化算法,该算法会随着时间的推移增加动量。我认为由此产生的小幅增长导致它过冲。目前运行没有辍学,但我得到了比以前更好的结果,因为有一个恒定的动力。运行 1000 个 epoch 后,我将使用 dropout 进行检查
现在在 dropout 的情况下运行,它没有爆炸,所以我想我已经解决了这个问题。
【问题讨论】:
-
好的,我在我的模型中发现了一个大问题。我没有正确设置卷积层参数,所以我将通过并确保这些参数正确,然后看看我是否仍然遇到同样的问题。
标签: tensorflow nan