我使用BiLSTM+CRF做了一个序列标签模型用于后处理。但我发现我的crf.accuracy增长太快了,在第一个时代就达到了1.0。我使用keras_contrib库中的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 ===========================>..-预计到达时间: 4s -损失: 17.2046 - acc: 0.9666 1920/2000 ===========================>.-预计到达时间: 3s -损失: 17.1906 - acc: 0.9671 1952/2000年============================>。-预计到达时间: 2s -损失: 17.2806 - acc: 0.9677 1984年/2000年============================>。-预计到达时间: 0s -损失: 17.2222 -访问权限: 0.9682
但如果我不使用CRF,准确率只有0.4,就像else部分中的代码一样,而且训练看起来更正常。
所以不管我是否忽略keras_contrib的CRF中的一些细节
发布于 2018-10-24 15:18:50
我找到了窃听器。因为我的目标是一个单热点向量,所以我不能设置sparse_target=True。在我修复之后,它现在看起来很正常。
https://stackoverflow.com/questions/52962608
复制相似问题