SparseCategoricalCrossentropy 文档有一个“在 GitHub 上查看源代码”选项卡,您可以单击它。这将向您展示实现。这样做会导致我们到达line 666 或tensorflow.python.keras.losses。我们可以从类定义中看到,它包装了一个函数sparse_categorical_crossentropy,该函数定义在tensorflow.keras.backend 的line 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。不确定这是否能满足您的稀疏性要求,但可能比尝试自己实现一些东西更好。