我正在Tensorflow(使用tf.keras
)执行文本分类任务。以前,我只是使用文本功能,我的损失是sparse_categorical_crossentropy
,培训看起来是这样的:
这完全在预料之中,损失约为7。在
现在,我添加了2个随机浮动特性,它们介于0和100000之间。我更新了我的tf.data.Dataset
对象,因此它们现在看起来像:
dataset = tf.data.Dataset.from_tensor_slices(({"review": x_rev_train, "structured": x_structured_train}, labels_train))
并创建了一个新的Input
对象,将其连接到我的图形。看起来很正常。在
所以我现在的损失大概是1000万(从100万美元开始)。我很困惑。鉴于范畴交叉熵是如何定义的,这显然是错误的。。。在
所以我开始调试,并使两个浮点特征的值为0.0。当我这样做的时候,失去的又回到了第一张照片。在
然后我将两个浮点特性都设置为100000.0的常量值,然后问题又出现了。所以我认为这与这两个浮动特性的大小有关。在
有没有想过我可能做错了什么?我知道我还没有缩放这两个浮动特性,但为什么我的损失会像那样爆炸呢?在
谢谢你的帮助!在
编辑:
似乎这种巨大的损失只发生在第一个时代?在随后的时代,它又回到了正常状态。有什么想法吗?在
这正是您需要将模型中的数字特征标准化的原因。这在几乎所有具有不同取值范围的特征的ann中都是必要的。在第一步之后,权重可以做一个巨大的跳跃来尝试对这些大规模特征进行建模,你的损失将恢复正常,但在开始时权重是随机的,可能集中在零附近,这取决于你如何初始化它们。如果你在一开始就考虑这些小特征权重的输出预测,然后看到这些非标准化特征值的差异将达到数百万个数量级,这就是损失值爆炸的原因。在
教训是,如果不首先将这些特征标准化(减去平均值并除以标准差),就不应该将这些特征放入网络中。试着这样做,你会发现行为会恢复正常。在
相关问题 更多 >
编程相关推荐