张量流神经网络损耗值NaN

时间:2017-05-19 08:16:39

标签: python tensorflow neural-network loss tf-slim

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

该模型的目标是预测~4500个不同的类 - 因此它是一个分类问题。当使用tf.print时,我看到在第一个训练步骤(或通过MLP前馈)后,从最后一个完全连接的层出来的预测似乎是正确的(所有变化的数字在1到4500之间)。但是,之后,最后一个完全连接的层的输出将转到全0或其他常数(0 0 0 0 0)。

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

  • 3层模型。所有完全连接的层。

  • 批量大小为1000

  • 学习率为.001(我也试过.1和.01但没有改变)

  • 使用CrossEntropyLoss(我确实添加了一个epsilon值以防止log0)

  • 使用AdamOptimizer

  • 学习率下降是.95

该模型的确切代码如下:(我使用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}

任何帮助将不胜感激!非常感谢你!

3 个答案:

答案 0 :(得分:1)

两个(可能更多)原因导致它无效:

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

答案 1 :(得分:0)

由于某些原因,你的训练过程有所不同,你的体重可能有无限的值,这会给NaN带来损失。原因可能很多,尝试更改您的训练参数(使用较小的批次进行测试)。

另外,在分类器中使用relu作为最后一个输出并不是常用的方法,请尝试使用sigmoid。

答案 2 :(得分:0)

根据我的理解,Relu并没有对神经网络的上限设置上限,因此根据其实现情况,它更有可能解除收敛。

尝试将所有激活功能切换为tanh或sigmoid。 Relu通常用于cnns中的卷积。

由于我们不知道你是如何用ε值实现的,所以很难确定你是否因交叉熵而去凝结。尝试使用残差更简单但仍然有效。

5000-5000-4500神经网络也是巨大的。你实际上不太可能需要一个庞大的网络。