张量流稀疏分类交叉熵是如何实现的?

2024-10-03 09:11:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 内存https图像版本编码tensorflow矩阵交叉
1条回答
网友
1楼 · 发布于 2024-10-03 09:11:35

SparseCategoricalCrossentropy文档有一个“查看GitHub上的源代码”选项卡,您可以单击该选项卡。这将向您展示实现。这样做会让我们找到{}中的{a2}。我们可以从类定义中看到,它包装了一个函数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导入运行TysFooL++的C++代码的名称是^ {CD7}文件的名称。因此,我们真正想要的是一个稀疏的SuftMax C++内核,它可以在^ {A5}中找到。此op调用一个functor,该functor调用方法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

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

编辑: 还有一个方法^{}。不确定这是否适用于您的稀疏性要求,但可能比您自己尝试实现某些东西效果更好

相关问题 更多 >