【发布时间】:2019-03-28 11:48:29
【问题描述】:
我使用 BiLSTM+CRF 为 postagging 做一个序列标记模型。但我发现我的 crf.accuracy 增长如此之快,仅在第一个 epoch 就达到了 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:4s - 损失:17.2046 - acc:0.9666 1920/2000 [===========================>..] - ETA:3s - 损失:17.1906 - acc:0.9671 1952/2000 [=============================>.] - ETA:2s - 损失:17.2806 -acc:0.9677 1984/2000 [============================>.] - ETA:0s - 损失:17.2222 - acc:0.9682
但是如果我不使用CRF,准确率只有0.4,就像else部分的代码一样,训练看起来更正常。
那么我是否忽略了 keras_contrib 的 CRF 中的一些细节
【问题讨论】: