2

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

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

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

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

  • 批量大小为 1000

  • 0.001 的学习率(我也尝试了 0.1 和 0.01 但没有任何改变)

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

  • 使用亚当优化器

  • 学习率衰减为 0.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}

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

4

3 回答 3

2

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

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

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

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

于 2017-05-19T08:28:46.997 回答
0

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

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

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

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

于 2017-05-21T04:35:08.513 回答