【问题标题】:Keras - CRF contrib throws error: ValueError: ('Could not interpret loss function identifier:', <property object at 0x000002477F1B82C8>)Keras - CRF contrib 抛出错误:ValueError:('无法解释损失函数标识符:',<property object at 0x000002477F1B82C8>)
【发布时间】:2018-10-06 00:12:07
【问题描述】:

我正在尝试将 crf 层添加到我的功能模型中,但出现此错误,我无法解决:

ValueError: ('无法解释损失函数标识符:', )

CRF 层来自 keras contribs 包。

型号:

from keras_contrib.layers import CRF


inputs = Input(shape=(MAX_LENGTH,))

embedding = Embedding(VOCAB_SIZE +1, EMBEDDING_SIZE, mask_zero= True)(inputs)

left = LSTM(HIDDEN_SIZE, return_sequences=True)(embedding)
right = LSTM(HIDDEN_SIZE, go_backwards=True, return_sequences=True)(embedding)
left_right = concatenate([left, right])

left2 = LSTM(HIDDEN_SIZE, return_sequences=True)(embedding)
right2 = LSTM(HIDDEN_SIZE, go_backwards=True, return_sequences=True)(embedding)
left_right2 = concatenate([left2, right2])

left_right_combi = add([left_right, left_right2])

left_right_combii = TimeDistributed(Dense(NUM_LABELS, activation='softmax'))\
(left_right_combi)


crf = CRF(NUM_LABELS, sparse_target=True)(left_right_combii)

combined_model = Model(inputs=inputs, outputs=crf)
combined_model.compile(loss=CRF.loss_function, optimizer='adam', metrics=[CRF.accuracy])

如果我使用“正常”损失函数和指标,我会收到此错误:

combined_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

"ValueError: An operation has None for gradient. 请确保 您的所有操作都定义了渐变(即 可微)。没有梯度的常见操作:K.argmax,K.round, K.eval。”

知道如何正确使用 crf 层吗?

谢谢你:)

【问题讨论】:

  • 我们不能运行这个例子,类CRF是未定义的,你需要更好的解释问题给任何人提供答案。
  • @Matias Valdenegro 不幸的是,我无法提供数据,因此无论如何您都无法运行代码。如果 Class CRF 未定义,则必须从 Keras contribs 包中安装 CRF。

标签: python tensorflow neural-network keras crf


【解决方案1】:

您应该导入 crf_loss 和 'crf_accuracy' 以正确使用 CRF 层

总结一下,它看起来像这样:

from keras_contrib.losses import crf_loss
from keras_contrib.metrics import crf_accuracy
#.
#.
#.
model.compile(optimizer="adam", loss=crf_loss, metrics=[crf_accuracy])

您还可以从 Keras 贡献的 GitHub 中查看this example

【讨论】:

    【解决方案2】:

    keras-contrib 的 CRF 层在 learn_mode='join'(默认模式)中使用时需要 crf_loss。如果你想使用任何其他正常的损失函数,比如 crossentropy,你应该在实例化时设置 learn_mode='marginal'。

    crf=CRF(&lt;classes&gt;,learn_mode='marginal')

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 1970-01-01
      • 2022-12-13
      • 2018-10-07
      • 2019-10-16
      • 2016-03-11
      • 1970-01-01
      • 2019-04-11
      • 2020-12-24
      相关资源
      最近更新 更多