Keras - CRF contrib抛出错误:ValueError:('无法解释丢失函数标识符:',<property object =“”at =“”0x000002477f1b82c8 =“”>)

时间:2018-04-25 13:25:48

标签: python tensorflow neural-network keras crf

我正在尝试将crf图层添加到我的功能模型中,但是得到了这个错误,我无法解决:

  

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

CRF Layer来自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:渐变操作有None。请确认   所有的操作都定义了一个渐变(即   微)。没有渐变的常见操作:K.argmax,K.round,   K.eval“。

我是如何正确使用crf图层的?

谢谢:)

2 个答案:

答案 0 :(得分:0)

您应该导入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

答案 1 :(得分:0)

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

crf=CRF(<classes>,learn_mode='marginal')