我正在尝试将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图层的?
谢谢:)
答案 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')