【问题标题】:TF/Keras Sparse categorical crossentropyTF/Keras 稀疏分类交叉熵
【发布时间】:2019-12-18 09:05:43
【问题描述】:

我的数据被松散地标记为单一类别“重要性”。 基本上,标签是 [0..5] 并且具有相同的含义 - 它们仅表示相同的事件,但突出程度不同。 想象一个阳光明媚的海滩???并且您的数据是海浪滚到沙子上的力(或另一种解释 - 每波行进到海滩边缘的距离并分为 5 个垃圾箱/类别)..

我的问题 - 如果我使用稀疏分类交叉熵来预测波浪类别,TF/Keras 模型是否会“理解”5 比 4 更大(更好/信息更多)和 4 大于 3 等等。

是否可以推断出标签值之间是相互关联的?标签序列 1 2 3 4 5 与 5 4 3 2 1 不一样?

数据支持上述事实,但模型能解决这个问题吗?我可以做些什么来让模型更容易做到这一点?

或者换句话说 - 在解释分类标签值的意义上,稀疏分类交叉熵的内在实现是什么?

【问题讨论】:

    标签: tensorflow machine-learning keras


    【解决方案1】:

    这是一个非常好的问题。这是我对您的问题的直觉。稀疏类别交叉熵威胁每个类别作为一个不同的类别。因此,假设您的标签为[0,1,2,3,4,5]1(即[0,1,0,0,0,0])和3(即[0,0,1,0,0,0])之间没有任何联系。另一方面,您的标签表示单个事件的大小,其中5 是最大值,0 是最小值。因此,我会将您的标签标准化为:

    labels = labels / max(labels)
    

    然后计算单个事件的sigmoid交叉熵,其中1.0表示最高概率,0.0最低。从这个意义上说,您的标签将在以下范围内[0.0, 0.2, 0.4, 0.6, 0.8, 1.0]。您可以通过以下方式做到这一点:

    # Random labels
    labels = np.array([0, 1, 4, 2, 1, 3, 4, 0, 5])
    # Normalized labels
    labels = labels / np.amax(labels)
    # Random logits
    logits = np.array([1.0, 0.5, 0.4, 0.1, 0.3, 0.6, 0.1, 0.9, 0.2])
    loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=logits)
    with tf.Session() as sess:
        sess.run(loss)
    

    【讨论】:

    • no no gorjan - 您正在将一个热分类交叉熵与稀疏交叉熵混合在一起(这是 1,2,3,4,5 等 int 值......不是 00001 00010 等。是吗? PS obv 000001 不是用于我想要的东西的好主意,但我希望 sparse 可以在算法中继承它..或者也许还有另一种方法?我不能是唯一一个有这样任务的人
    • 来自tf.nn.sparse_softmax_cross_entropy_with_logits 的文档:测量类别互斥的离散分类任务中的概率误差(每个条目恰好属于一个类别)。所以不,不取决于您是使用稀疏分类交叉熵还是一种热分类交叉熵,标签的处理方式没有区别。实际上,稀疏分类交叉熵和分类交叉熵之间的唯一区别是真实标签的格式。在您的情况下,您有一个事件,其中标签指示幅度。
    • 尽管我很确定我的直觉是正确的,但让我们拭目以待,看看其他答案和其他人对此事的看法。我也想知道是否可能对您的问题有其他解释,从而有其他解决方案。
    • 其在定义中:keras.io/losses 向下滚动查看 - 当使用 sparse_categorical_crossentropy 损失时,您的目标应该是 integer 目标。 HTH
    • 你说得对。如评论中所述,区别在于标签的格式。但是,来自 Tensorflow 网站的 this link 提供了定义。请检查一下。
    猜你喜欢
    • 2021-02-15
    • 2021-03-19
    • 2019-05-23
    • 2019-06-05
    • 1970-01-01
    • 2016-09-18
    • 2020-09-10
    • 2021-07-17
    • 2020-10-12
    相关资源
    最近更新 更多