Tensorflow神经网络损失值NaN

Tensorflow neural network loss value NaN

我正在尝试在大型数据集上构建一个简单的多层感知器模型,但我得到的损失值为 nan。奇怪的是:在第一个训练步骤之后,损失值不是 nan,而是大约 46(这是奇怪的低。当 i 运行 逻辑回归模型时,第一个损失值大约是 ~3600)。但是,在那之后损失值一直是 nan。我也使用 tf.print 来尝试调试它。

该模型的目标是预测 ~4500 个不同 类 - 所以这是一个分类问题。使用 tf.print 时,我发现在第一个训练步骤(或通过 MLP 进行前馈)之后,来自最后一个完全连接层的预测似乎是正确的(所有数字都在 1 到 4500 之间)。但是,在那之后,最后一个完全连接层的输出变为全 0 或某个其他常数 (0 0 0 0 0)。

有关我的模型的一些信息:

模型的确切代码如下:(我使用的是 TF-Slim 库)

input_layer = slim.fully_connected(model_input, 5000, activation_fn=tf.nn.relu)
hidden_layer = slim.fully_connected(input_layer, 5000, activation_fn=tf.nn.relu)
output = slim.fully_connected(hidden_layer, vocab_size, activation_fn=tf.nn.relu)
output = tf.Print(output, [tf.argmax(output, 1)], 'out = ', summarize = 20, first_n = 10)
return {"predictions": output}

如有任何帮助,我们将不胜感激!非常感谢!

由于某些原因,您的训练过程出现了分歧,并且您的权重可能有无穷大的值,这会导致 NaN 损失。原因可能有很多,请尝试更改您的训练参数(使用较小的批次进行测试)。

此外,对分类器中的最后一个输出使用 relu 不是通常的方法,请尝试使用 sigmoid。

它不起作用的两个(可能更多)原因:

  1. 您跳过或不适当地应用了您的特征缩放 输入和输出。因此,数据可能难以处理 对于 Tensorflow。
  2. 使用不连续函数 ReLu 可能会引发问题。尝试使用其他激活函数,例如 tanh 或 sigmoid。

据我了解,Relu 并未对神经网络的上限设置上限,因此它更有可能根据其实现而解聚。

尝试将所有激活函数切换为 tanh 或 sigmoid。 Relu 一般用于 CNN 中的卷积。

也很难确定你的去收敛是否是由于交叉熵造成的,因为我们不知道你是如何用你的 epsilon 值影响它的。尝试只使用残差,它更简单但仍然有效。

5000-5000-4500 的神经网络也很大。您实际上不太可能需要那么大的网络。