希望您能帮帮我。我正在使用TensorFlow和一些从网上找到的教程实现一个小型多层感知机。问题是网络能够学到一些东西,我是说我能够优化训练误差的值并获得不错的准确率,这就是我的目标。然而,我在Tensorboard上记录了一些损失函数的奇怪NaN值。实际上相当多。您可以看到我最近在Tensorboard上记录的损失函数输出。请注意那些三角形后面跟着的不连续性 – 那些就是NaN值,同时请注意函数的总体趋势是您所期望的。
我认为可能是学习率过高,或者网络太深导致梯度爆炸,所以我降低了学习率并使用了一个隐藏层(这就是上面图片和下面代码的配置)。但什么也没改变,我只是让学习过程变得更慢了。
TensorFlow代码
这段代码不需要翻译
回答:
我会在这里发布解决方案,以防有人遇到类似的问题。如果您仔细观察那个图表,所有NaN值(三角形)都是有规律地出现的,就像在每次循环结束时有什么东西导致损失函数的输出变为NaN一样。问题在于,每次循环时,我都提供了一个“空”的例子迷你批次。问题出在我如何声明内部训练循环:
for i in range(total_batch):
现在我们希望TensorFlow能够一次一个迷你批次地遍历整个训练集。所以让我们看看total_batch是如何声明的:
total_batch = int(num_examples/mini_batch_size)
这并不是我们想要做的 – 因为我们只想考虑训练集。因此,将这行改为:
total_batch = int(training_set_size/mini_batch_size)
解决了这个问题。需要注意的是,TensorFlow似乎忽略了这些“空”的批次,对于损失计算出NaN但不更新梯度 – 这就是为什么损失的趋势像是一个正在学习的网络。