Tensorflow培训/验证丢失问题

时间:2017-02-19 17:36:37

标签: tensorflow nan

我在这里读了一些关于在获得训练/验证损失时做些什么的其他帖子。虽然我想知道是否有人可以只是看看并同意/不同意,我认为我的问题在我的学习率上没有足够的衰减。

我正在关注精彩的博文here,但在tensorflow中实施。转换模型相当容易,但动量和学习速度有点棘手,我认为这就是问题所在。我遇到了一些问题,我只能在损失跳升到南方之前走这么多个时代。我正在使用的模型应该等同于博客教程中的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。我已经在模型中实现了它,我只是通过一个张量bool告诉它是否训练。因此,在启用了辍学的情况下,我会在不到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

有关启用辍学问题可能出现的问题的任何想法?我已经建立了完全相同的模型,即使没有纳米问题,我的损失也不是那么好。

我的代码:https://github.com/sdeck51/CNNTutorials/blob/master/7.%20FacialFeatureDetection_Tutorial/FaceDetector.ipynb

编辑:

所以我的卷积层设置不正确。我已经阅读了有这个的教程。

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)

仍然没有工作。在卷积层和第一个完全连接的层上启用了压降,模型持续不到50个时期,然后错误通过屋顶。即使学习率很低,问题仍然存在。

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

看起来非辍学方法被破坏并做同样的事情> _> ...

编辑:我想我已经弄明白了这个问题。我正在使用动量优化算法,随着时间的推移增加动量。我认为由此引起的小幅增加导致其超调。目前正在没有辍学的情况下运行,但是我通过持续的动力获得了比以前更好的结果。在我运行1000个纪元后,我将用辍学检查它

现在正在辍学而且它没有爆炸,所以我想我已经解决了这个问题。

1 个答案:

答案 0 :(得分:0)

问题确实是优化者。我正在使用Momentum优化器,我最初设置为.9,它应该在其时期周期结束时变为.999。由于某种原因,额外的动力导致了天空火箭的损失。将其保留为.9可以解决问题。