TensorFlow中多层感知机损失函数的奇怪NaN值

希望您能帮帮我。我正在使用TensorFlow和一些从网上找到的教程实现一个小型多层感知机。问题是网络能够学到一些东西,我是说我能够优化训练误差的值并获得不错的准确率,这就是我的目标。然而,我在Tensorboard上记录了一些损失函数的奇怪NaN值。实际上相当多。您可以看到我最近在Tensorboard上记录的损失函数输出。请注意那些三角形后面跟着的不连续性 – 那些就是NaN值,同时请注意函数的总体趋势是您所期望的。

Tensorboard报告我在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但不更新梯度 – 这就是为什么损失的趋势像是一个正在学习的网络。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注