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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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