我正在尝试建立一个模型,用于将标签序列标记到文档中的句子序列。为此,我将 Bi-LSTM 与 CRF 结合使用。我在我的模型中使用 TensorFlow-addons CRF 层,在训练和预测方法之后,我使用 viterbi_decode 函数来获取表示句子标签的整数序列。我不知道下面的代码是否代表了带有 CRF 的 Bi-LSTM 的准确实现,或者我做错了什么。因为性能非常低,我期待使用 CRF 进行序列标记有助于提高宏观平均分数。我怎样才能改善这一点?
代码在这里:
import tensorflow_addons as tfa
from tensorflow_addons.layers import CRF
def create_model(): #
max_words=length_long_sentence
MAX_SENTENCE_NUM=100
embedding_size=100
lstm_size=128
learn_rate=0.01
output_size=19
current_input=Input(shape=(MAX_SENTENCE_NUM,max_words,))
emb_current = Embedding(vocab_size, embedding_size, input_length=max_words,
name='current_embed')(current_input)
hidden_vectors=TimeDistributed(Bidirectional(LSTM(units=lstm_size, return_sequences=False)))
(emb_current )
print('BiLSTM1',hidden_vectors.shape)
hidden_vectors=Bidirectional(LSTM(units=lstm_size, return_sequences=True))(hidden_vectors )
crf =CRF(output_size)
decoded_sequence, potentials, sequence_length, chain_kernel = crf(hidden_vectors)
model = Model(inputs=current_input, outputs=potentials)
loss=tfa.losses.SigmoidFocalCrossEntropy()
opt = tf.keras.optimizers.Adam(learning_rate=learn_rate)
model.compile(optimizer=opt, loss=loss, metrics=['accuracy'])
print(model.summary())
return model
model=create_model()
这是使用 viterbi_decode 获取序列的代码:
result=model.predict(x_test)
trans_matrix = tf.compat.v1.get_variable('transition', [19,19])
pred_sequence_label=[]
for i in range(0,result.shape[0]):
sequence=tfa.text.viterbi_decode(np.array(result[i]),trans_matrix)
pred_sequence_label.append(sequence[0])