首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Keras中实现Perplexity?

如何在Keras中实现Perplexity?
EN

Stack Overflow用户
提问于 2017-06-22 18:52:48
回答 3查看 4.6K关注 0票数 1

我一直在尝试评估语言模型,我需要跟踪困惑度量。

我尝试的是:由于困惑是2^-J,其中J是交叉熵:

代码语言:javascript
复制
def perplexity(y_true, y_pred):
        oneoverlog2 = 1.442695
        return K.pow(2.0,K.mean(-K.log(y_pred)*oneoverlog2))

但奇怪的是,在几个批次的训练过程中,这是无限的。

有没有什么错误的实现方式或者其他方式来实现perplexity?

EN

回答 3

Stack Overflow用户

发布于 2017-06-22 19:15:36

你在计算交叉熵公式,这个公式对于y_pred=0来说是未定义的,而且它在数值上是不稳定的。

我建议您使用tf.sparse_cross_entropy_with_logits,而不是编写您自己的公式。该函数为您处理数值不稳定问题和输入为零的情况。

如果你真的想自己写公式,可以在t_pred中添加少量的值,以使其不同于0,或者从非常小的值和1中裁剪y_pred

票数 3
EN

Stack Overflow用户

发布于 2018-12-01 04:00:11

我已经提出了两个版本,并附上了相应的源代码,请随时查看链接。

代码语言:javascript
复制
def perplexity_raw(y_true, y_pred):
    """
    The perplexity metric. Why isn't this part of Keras yet?!
    https://stackoverflow.com/questions/41881308/how-to-calculate-perplexity-of-rnn-in-tensorflow
    https://github.com/keras-team/keras/issues/8267
    """
#     cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred)
    cross_entropy = K.cast(K.equal(K.max(y_true, axis=-1),
                          K.cast(K.argmax(y_pred, axis=-1), K.floatx())),
                  K.floatx())
    perplexity = K.exp(cross_entropy)
    return perplexity

def perplexity(y_true, y_pred):
    """
    The perplexity metric. Why isn't this part of Keras yet?!
    https://stackoverflow.com/questions/41881308/how-to-calculate-perplexity-of-rnn-in-tensorflow
    https://github.com/keras-team/keras/issues/8267
    """
    cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred)
    perplexity = K.exp(cross_entropy)
    return perplexity

抄袭自我在Check perplexity of a Language Model的回答

票数 1
EN

Stack Overflow用户

发布于 2019-05-14 18:18:12

我已经在这个主题上做了一些研究,我想我可以在这个问题上提供一些启发。

如果你想使用Keras并根据你的定义来计算困惑,它应该是这样的:

代码语言:javascript
复制
def ppl_2(y_true, y_pred):
    return K.pow(2.0, K.mean(K.categorical_crossentropy(y_true, y_pred)))

然而,基础should be e不是2。那么困惑将是:

代码语言:javascript
复制
def ppl_e(y_true, y_pred):
    return K.exp(K.mean(K.categorical_crossentropy(y_true, y_pred)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44697318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档