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)。
有关我的模型的一些信息:
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}
如有任何帮助,我们将不胜感激!非常感谢!
由于某些原因,您的训练过程出现了分歧,并且您的权重可能有无穷大的值,这会导致 NaN 损失。原因可能有很多,请尝试更改您的训练参数(使用较小的批次进行测试)。
此外,对分类器中的最后一个输出使用 relu 不是通常的方法,请尝试使用 sigmoid。
它不起作用的两个(可能更多)原因:
- 您跳过或不适当地应用了您的特征缩放
输入和输出。因此,数据可能难以处理
对于 Tensorflow。
- 使用不连续函数 ReLu 可能会引发问题。尝试使用其他激活函数,例如 tanh 或 sigmoid。
据我了解,Relu 并未对神经网络的上限设置上限,因此它更有可能根据其实现而解聚。
尝试将所有激活函数切换为 tanh 或 sigmoid。 Relu 一般用于 CNN 中的卷积。
也很难确定你的去收敛是否是由于交叉熵造成的,因为我们不知道你是如何用你的 epsilon 值影响它的。尝试只使用残差,它更简单但仍然有效。
5000-5000-4500 的神经网络也很大。您实际上不太可能需要那么大的网络。
我正在尝试在大型数据集上构建一个简单的多层感知器模型,但我得到的损失值为 nan。奇怪的是:在第一个训练步骤之后,损失值不是 nan,而是大约 46(这是奇怪的低。当 i 运行 逻辑回归模型时,第一个损失值大约是 ~3600)。但是,在那之后损失值一直是 nan。我也使用 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}
如有任何帮助,我们将不胜感激!非常感谢!
由于某些原因,您的训练过程出现了分歧,并且您的权重可能有无穷大的值,这会导致 NaN 损失。原因可能有很多,请尝试更改您的训练参数(使用较小的批次进行测试)。
此外,对分类器中的最后一个输出使用 relu 不是通常的方法,请尝试使用 sigmoid。
它不起作用的两个(可能更多)原因:
- 您跳过或不适当地应用了您的特征缩放 输入和输出。因此,数据可能难以处理 对于 Tensorflow。
- 使用不连续函数 ReLu 可能会引发问题。尝试使用其他激活函数,例如 tanh 或 sigmoid。
据我了解,Relu 并未对神经网络的上限设置上限,因此它更有可能根据其实现而解聚。
尝试将所有激活函数切换为 tanh 或 sigmoid。 Relu 一般用于 CNN 中的卷积。
也很难确定你的去收敛是否是由于交叉熵造成的,因为我们不知道你是如何用你的 epsilon 值影响它的。尝试只使用残差,它更简单但仍然有效。
5000-5000-4500 的神经网络也很大。您实际上不太可能需要那么大的网络。