我使用BiLSTM + CRF进行后标记的序列标记模型。但是我发现我的crf.accuracy增长如此之快,仅在第一个时期就达到了1.0。
我使用来自keras_contrib lib的CRF层,并编写引用CRF示例的代码。我的后端是Tensorflow。
output = TimeDistributed(Dense(100,activation='relu'),name='Dense_1')(lstm_output)
output = Dropout(rate=0.3)(output)
if self.use_crf:
crf_layer = CRF(self.label_num,sparse_target=True)
output = crf_layer(output)
model = Model(inputs, output)
model.compile('adam', loss=crf_layer.loss_function, metrics=[crf_layer.accuracy])
else:
output = TimeDistributed(Dense(self.label_num,activation='softmax'), name='Dense_2')(output)
model = Model(inputs, output)
model.compile('adam', loss='categorical_crossentropy', metrics=['accuracy'])
但是crf_layer.accuracy似乎增长得如此之快。在第一个时期,它显示为
1888/2000 [========================== ..]-ETA:4秒-亏损:17.2046-acc:0.9666 1920/2000 [========================== ..]-ETA:3秒-损失:17.1906-acc:0.9671 1952/2000 [===========================>。]-ETA:2秒-损失:17.2806-acc:0.9677 1984/2000 [===========================>。]-ETA:0s-损失:17.2222-acc:0.9682
但是,如果我不使用CRF,则准确性仅为0.4,就像其他部分的代码一样,并且训练看起来更加正常。
所以我是否忽略keras_contrib的CRF中的一些细节
答案 0 :(得分:1)
我发现了错误。因为我的目标是一个热点向量,所以无法设置sparse_target = True。解决此问题后,现在看起来很正常。