【问题标题】:What does the implementation of keras.losses.sparse_categorical_crossentropy look like?keras.losses.sparse_categorical_crossentropy 的实现是什么样的?
【发布时间】:2020-01-03 10:51:38
【问题描述】:

我发现 tf.keras.losses.sparse_categorical_crossentropy 是一个了不起的类,它可以帮助我为具有大量输出类的神经网络创建损失函数。没有这个,就不可能训练模型,因为我发现 tf.keras.losses.categorical_crossentropy 由于将索引转换为非常大的 1-hot 向量而导致内存不足错误.

然而,我在理解 sparse_categorical_crossentropy 如何避免大内存问题方面存在问题。我查看了 TF 的 code,但确实不容易知道引擎盖下的内容。

那么,任何人都可以提供一些实现此功能的高级想法吗?实现是什么样的? 谢谢!

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    它没有做任何特别的事情,它只是在需要时为一批数据(不是同时的所有数据)在损失内生成 one-hot 编码标签,然后丢弃结果。所以它只是内存和计算之间的经典权衡。

    【讨论】:

    • 感谢您的有用回答。您还可以看看丹尼尔的回答如下吗?他对我的问题给出了完全不同的答案。
    【解决方案2】:

    分类交叉熵的公式如下:

    y_true 是地面实况数据,y_pred 是模型的预测。

    y_truey_pred 的维度越大,执行所有这些操作就需要更多的内存。

    但是请注意这个公式中的一个有趣的技巧:y_true 中只有一个神经元是 1,其余的都是零!!!这意味着我们可以假设总和中只有一项是非零的。

    稀疏公式的作用是:

    • 避免需要为y_true 提供巨大的矩阵,只使用索引而不是 one-hot 编码
    • y_pred 中仅选择与索引相关的列,而不是对整个张量执行计算。

    所以,这里稀疏公式的主要思想是:

    • 使用y_true 中的索引从y_pred 收集列。
    • 只计算术语-ln(y_pred_selected_columns)

    【讨论】:

    • 感谢您的回答。我认为您的回答与@Matias Valdenegro 的回答完全相反。哪一个是正确的? ...
    • @user1953737 我不同意这个答案是相反的,因为它提供了更多细节,所以它是互补的。
    • @MatiasValdenegro:根据您的回答,我认为它所做的是将一批目标 idxs 转换为一批 1 个热向量。按照丹尼尔的回答,我认为他的意思是使用 tf.gather_nd 之类的东西。因此,我很困惑哪一个是真正的 tf 所做的。谢谢。
    • 据我了解,分类交叉熵可以用于多标签问题,但稀疏分类交叉熵不能。我想知道如何处理我们遇到的情况,例如10,000 个可能的输出类别,每个输入属于例如3班。这里我们需要提供一个 1 的 3 倍(或 0.33)和 0 的 9997 倍的输出向量?
    • @ChristianWartena,您需要一个大小为 10000 的输出向量,其中包含 3 乘以 1。您需要使用“sigmoid”和“binary crossentropy”。
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多