我正在研究SparseCategoricalCrossentropy
的加权版本。现在,我的实现是将y_真转换为一个热形式,并计算交叉熵,然后将其与权重矩阵相乘。当权重都为1时,我在实现和SparseCategoricalCrossentropy
之间得到相同的输出,但是我的问题是一个热编码。我有很多类(32+bg),当使用一个热编码时,对于大的图像/批大小,我的内存会耗尽,这在SparseCategoricalCrossentropy
中是不会发生的。我试图弄清楚如何实现内置编码(有没有办法避免热编码等)。内置的是如何实现的,或者在何处实现的查看[1]它可能是在本机端实现的,但我找不到它
[1]https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/losses.py#L692
SparseCategoricalCrossentropy文档有一个“查看GitHub上的源代码”选项卡,您可以单击该选项卡。这将向您展示实现。这样做会让我们找到{}中的{a2}。我们可以从类定义中看到,它包装了一个函数
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导入运行TysFooL++的C++代码的名称是^ {CD7}文件的名称。因此,我们真正想要的是一个稀疏的SuftMax C++内核,它可以在^ {A5}中找到。此op调用一个functor,该functor调用方法SparseXentEigenImpl
,该方法的实现可以在corresponding header file, sparse_xent_op.h中找到。从该文件的第47行开始,你可以看到它们是如何产生稀疏损耗的关于line 224有一条关于概述损失计算公式的评论
不确定这是否有助于创建加权op,但这就是在tensorflow中计算稀疏xent的方式
编辑: 还有一个方法^{} 。不确定这是否适用于您的稀疏性要求,但可能比您自己尝试实现某些东西效果更好
相关问题 更多 >
编程相关推荐