python - Tensorflow:难以置信的巨大稀疏分类交叉熵

标签 python tensorflow keras

我正在 Tensorflow 中执行文本分类任务(使用 tf.keras)。以前,我只是使用文本特征,我的损失是sparse_categorical_crossentropy,训练看起来像这样:

enter image description here

这完全在意料之中,损失约为 7。

现在,我添加了 2 个介于 0 到 100,000 之间的随机浮点特征。我已经更新了我的 tf.data.Dataset 对象,因此它们现在看起来像:

dataset = tf.data.Dataset.from_tensor_slices(({"review": x_rev_train, "structed": x_structed_train}, labels_train))

并创建了一个新的Input对象,将其连接到我的图表。看起来很正常。

我现在训练并看到这个: enter image description here

所以我的损失现在约为数十百万(从 100 毫米以上开始)。我对此很困惑。考虑到分类交叉熵的定义方式,这似乎显然是错误的......

所以我开始调试并将两个浮点特征设置为常量值 0.0。当我这样做时,损失又恢复到第一张图片中的样子。

然后我将两个浮点特征设置为常量值 100000.0,问题又出现了。所以我认为这在某种程度上与这两个 float 功能的大小有关。

对于我可能做错了什么有什么想法吗?我知道我没有缩放这两个 float 功能,但为什么我的损失会像这样爆炸?

感谢您提供的任何帮助!

编辑:

这种巨大的损失似乎只发生在第一个纪元?在随后的纪元中它会恢复正常。有什么想法吗?

enter image description here

最佳答案

这正是您需要标准化模型中的数值特征的原因。这对于几乎所有具有不同取值范围特征的人工神经网络来说都是必要的。第一步之后,权重可能会发生巨大的跳跃,尝试对这些大规模特征进行建模,并且您的损失将恢复正常,但一开始权重是随机的,并且可能以零为中心,具体取决于您如何初始化它们。如果您一开始就考虑这些小特征权重的输出预测是什么,然后发现这些非标准化特征值的差异将达到数百万的数量级,这就是损失值爆炸的原因。

教训是,在没有先对这些特征进行归一化(减去平均值并除以标准差)的情况下,您永远不应该将这些特征放入网络中。尝试这样做,您会发现行为将恢复正常。

关于python - Tensorflow:难以置信的巨大稀疏分类交叉熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53861397/

相关文章:

Python 为图像添加一个 channel

python - Tensorflow 数据适配器错误 : ValueError: Failed to find data adapter that can handle input

machine-learning - 批量归一化而不是输入归一化

python - 在keras中的自定义损失函数中做一些数学计算

python - 来自 Aminer API 的请求

python - Dash Plotly - 如何设置 2 个条件来绘制直方图?

Python - 类似 PHP 的动态数组

python - 函数访问全局变量

tensorflow - TensorBoard (TensorFlow) 是否具有为绘图上的轴和图例添加标签的功能?如果是这样,如何?

python - 如何加载经过训练的 tensorflow 模型