2017-02-19 246 views
0

我已经阅读了一些其他文章,了解如何在培训/验证损失上得到nan时该怎么做。我假设我的问题在我的学习率方面还没有足够的衰减,尽管我想知道是否有人可以只看一眼并同意/不同意。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 

所以我已经看到了这一点,它似乎只是一个需要降低学习率的情况。它与教程编号不匹配,但令人担忧。

博客文章的下一步是添加丢失。我已经在模型中实现了它,我只是通过一个张量布尔来告诉它是否训练。所以在退出时我可以在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 

有关启用丢失时可能出现的问题的任何想法?我已经建立了完全相同的模型afaik,即使没有nan问题,我的损失也不是很好。

我的代码: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个纪元后,我要检查它与退路

现在运行与退路,它并没有炸毁,所以我想我已经解决了这个问题。

+0

好的,我在我的模型中发现了一个比较大的问题。我没有正确设置卷积层参数,因此我要通过并确保这些参数是正确的,然后看看我是否仍然存在相同的问题。 – Exuro

回答

0

问题确实是优化器。我使用的是Momentum优化器,我将它初始设置为.9,在它的时代周期结束时它应该变为.999。由于某种原因,这种额外的势头正在造成天空火箭的损失。留下它为.9解决了这个问题。