【问题标题】:How to add CRF layer in a tensorflow sequential model?如何在张量流顺序模型中添加 CRF 层?
【发布时间】:2020-03-20 00:06:27
【问题描述】:

我正在尝试在 TensorFlow 顺序模型中针对 NER 问题实现 CRF 层。我不知道该怎么做。以前当我实现 CRF 时,我使用来自 keras 的 CRF 和 tensorflow 作为后端,即我在 keras 而不是 tensorflow 中创建了整个模型,然后通过 CRF 传递了整个模型。有效。

但是现在我想在 Tensorflow 中开发模型,因为 tensorflow2.0.0 beta 已经内置了 keras,我正在尝试构建一个顺序层并在双向 lstm 层之后添加 CRF 层。虽然我不知道该怎么做。我已经阅读了 tensorflow-addons 中的 CRF 文档,它包含不同的功能,例如前向 CRF 等,但不确定如何将它们作为一个层来实现?我想知道是否有可能在顺序张量流模型中实现 CRF 层,还是我需要从头开始构建模型图然后使用 CRF 函数?任何人都可以帮我解决它。提前致谢

【问题讨论】:

标签: python-3.x tensorflow2.0 tf.keras crf


【解决方案1】:

在训练过程中

可以参考this API

tfa.text.crf_log_likelihood(
    inputs,
    tag_indices,
    sequence_lengths,
    transition_params=None
)

输入是一元电位(就像逻辑回归中的那样,您可以参考this answer),在您的情况下,它们是logits(通常不是softmax激活函数之后的分布)或编码器中每个字符的 BiLSTM 状态(上图中的 P1、P2、P3、P4;)。

tag_indices 是目标标签索引,sequence_lengths 表示批次中的序列长度。

transition_params 是二元势(也是标签如何从一个时间步转移到下一个时间步),您可以自己创建矩阵,也可以让 API 为您完成。

推理过程中
你只需使用this API

tfa.text.viterbi_decode(
    score,
    transition_params
) 

分数代表与训练中相同的输入(P1、P2、P3、P4 状态),transition_params 也是在训练过程中训练的。

【讨论】:

  • 所以如果我做对了,那么 LSTM 输出中的每个元素都必须作为参数单独传递给函数?
  • @SaiRaghava 您可以一次性获取状态向量并将它们输入到 CRF API 中。
猜你喜欢
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2019-09-08
  • 2021-10-25
  • 1970-01-01
  • 2020-02-21
  • 2018-09-29
  • 2017-12-04
相关资源
最近更新 更多