0

我正在尝试建立一个模型,用于将标签序列标记到文档中的句子序列。为此,我将 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])
4

0 回答 0