【问题标题】:How is Tensorflow SparseCategoricalCrossentropy is Impelemented?Tensorflow SparseCategoricalCrossentropy 是如何实现的?
【发布时间】:2021-06-04 21:46:07
【问题描述】:

我正在研究SparseCategoricalCrossentropy 的加权版本。现在我的实现是将 y_true 转换为一种热形式并计算交叉熵,然后将其与权重矩阵相乘。当权重都为 1 时,我的实现和 SparseCategoricalCrossentropy 之间的输出相同,但是我的问题是使用一种热编码。我有很多类(32+bg),当使用一种热编码时,我的大图像/批量大小的内存不足,SparseCategoricalCrossentropy 不会发生这种情况。我试图弄清楚内置是如何实现的(有没有办法避免一个热编码等)。内置是如何实现的,或者它是在哪里实现的,看看 [1] 它可能是在本机端实现的,但我找不到它?

[1]https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/losses.py#L692

【问题讨论】:

标签: python tensorflow keras loss-function


【解决方案1】:

SparseCategoricalCrossentropy 文档有一个“在 GitHub 上查看源代码”选项卡,您可以单击它。这将向您展示实现。这样做会导致我们到达line 666tensorflow.python.keras.losses。我们可以从类定义中看到,它包装了一个函数sparse_categorical_crossentropy,该函数定义在tensorflow.keras.backendline 4867 上。我们可以在函数定义的底部看到这是对tf.nn.sparse_softmax_cross_entropy_with_logits 的包装,这个函数定义可以在tensorflow.python.ops.nn_ops 中找到。在这个函数定义的底部,我们可以看到它是gen_nn_ops.sparse_softmax_cross_entropy_with_logits 的包装器。如果您查找gen_nn_ops,您将找不到它。它是 python 导入以运行 tensorflow 的 C++ 操作代码的 *.so 文件的名称。所以我们真正要找的是一个稀疏的softmax C++内核,可以在tensorflow.core.kernels.sparse_xent_op.cc找到。这个操作调用了一个仿函数,它调用了一个方法SparseXentEigenImpl,其实现可以在corresponding header file, sparse_xent_op.h中找到。从该文件的第 47 行开始,您可以看到它们是如何产生稀疏损失的。

// Generator for calculation of the sparse Xent loss.
// This generator takes the logits, the sum of the exponentiated
// logits, and the label indices.  For each minibatch entry, ignoring
// the batch index b, it calculates:
//
//   loss[j] = (log(sum_exp_logits) - logits[j]) * 1{ j == label }
//
// for j = 0 .. num_classes.  This value must be summed over all j for
// the final loss.

而在line 224 上有一条评论概述了损失计算公式。

//  sum(-labels *
//     ((logits - max_logits) - log(sum(exp(logits - max_logits)))))
//  along classes

不确定这是否有助于您创建加权运算,但这是在 tensorflow 中计算稀疏 xent 的方式。

编辑: 还有一个方法tf.nn.weighted_cross_entropy_with_logits。不确定这是否能满足您的稀疏性要求,但可能比尝试自己实现一些东西更好。

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 2020-11-07
    • 1970-01-01
    • 2017-07-05
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多