Реализация уровня CRF с BiLSTM-CRF в TensorFlow 1.15

Я реализовал двунаправленную нейронную сеть с долговременной краткосрочной памятью и условным слоем случайных полей (BiLSTM-CRF), используя keras и keras_contrib (последний для реализации CRF, который не является частью собственного keras functionality. Задача была названа классификацией распознавания именованных объектов в один из 6 классов.Вход в сеть представляет собой последовательность 300-мерных предварительно обученных вложений слов GloVe.Это сводка моей модели:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 648)               0   
_________________________________________________________________
embedding_1 (Embedding)      (None, 648, 300)          1500000   
_________________________________________________________________
bidirectional_1 (Bidirection (None, 648, 10000)        3204000   
_________________________________________________________________
crf_1 (CRF)                  (None, 648, 6)            6054      
=================================================================

Теперь я хочу реализовать ту же модель в TensorFlow 1.15. Поскольку модуль keras_contrib CRF работает только в keras, но не в TensorFlow, я использовал реализацию CRF, созданную для TensorFlow 1.X из это репозиторий. Репозиторий включает два хороших примера реализации CRF здесь, но каждый выдает другую ошибку при обучении на моих данных.

Реализация 1

from tensorflow.keras.layers import Bidirectional, Embedding, LSTM, TimeDistributed
from tensorflow.keras.models import Sequential

from tf_crf_layer.layer import CRF
from tf_crf_layer.loss import crf_loss
from tf_crf_layer.metrics import crf_accuracy

MAX_WORDS = 50000
EMBEDDING_LENGTH = 300
MAX_SEQUENCE_LENGTH = 648
HIDDEN_SIZE = 512

model = Sequential()
model.add(Embedding(MAX_WORDS, EMBEDDING_LENGTH, input_length=MAX_SEQUENCE_LENGTH, mask_zero=True, weights=[embedding_matrix], trainable=False))
model.add(Bidirectional(LSTM(HIDDEN_SIZE, return_sequences=True)))
model.add(CRF(len(labels)))

model.compile('adam', loss=crf_loss, metrics=[crf_accuracy])

Это ошибка, которую я получаю, когда пытаюсь скомпилировать модель:

File "/.../tf_crf_layer/metrics/crf_accuracy.py", line 48, in crf_accuracy
    crf, idx = y_pred._keras_history[:2]

AttributeError: 'Tensor' object has no attribute '_keras_history'

Ошибка возникает при вычислении crf_accuracy из репо, упомянутого выше.

def crf_accuracy(y_true, y_pred):
    """
    Get default accuracy based on CRF `test_mode`.
    """
    import pdb; pdb.set_trace()
    crf, idx = y_pred._keras_history[:2]
    if crf.test_mode == 'viterbi':
        return crf_viterbi_accuracy(y_true, y_pred)
    else:
        return crf_marginal_accuracy(y_true, y_pred)

По-видимому, такая ошибка возникает, когда тензорный объект не является результатом слоя keras, согласно этой ветке. Почему эта ошибка появляется здесь?

Реализация 2

from tf_crf_layer.layer import CRF
from tf_crf_layer.loss import crf_loss, ConditionalRandomFieldLoss
from tf_crf_layer.metrics import crf_accuracy
from tf_crf_layer.metrics.sequence_span_accuracy import SequenceSpanAccuracy

model = Sequential()
model.add(Embedding(MAX_WORDS, EMBEDDING_LENGTH, input_length=MAX_SEQUENCE_LENGTH, mask_zero=True, weights=[embedding_matrix], trainable=False))
model.add(Bidirectional(LSTM(HIDDEN_SIZE, return_sequences=True)))
model.add(CRF(len(labels), name="crf_layer"))

model.summary()

crf_loss_instance = ConditionalRandomFieldLoss()  
model.compile(loss={"crf_layer": crf_loss_instance}, optimizer='adam', metrics=[SequenceSpanAccuracy()])

Здесь модель компилируется, но как только начинается первая эпоха обучения, всплывает вот такая ошибка:

InvalidArgumentError: Expected begin and size arguments to be 1-D tensors of size 3, but got shapes [2] and [2] instead.
     [[{{node loss_4/crf_layer_loss/Slice_1}}]]

Я тренирую модель, используя мини-пакеты, может ли это объяснить ошибку? Я также заметил, что в сводке моей модели для уровня CRF отсутствует измерение (сравните спецификацию уровня CRF в сводке выше и в сводке ниже), хотя количество параметров для этого слоя такое же, как и выше. Почему возникает это несоответствие и как его можно исправить?

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_5 (Embedding)      (None, 648, 300)          1500000   
_________________________________________________________________
bidirectional_5 (Bidirection (None, 648, 1000)         3204000   
_________________________________________________________________
crf_layer (CRF)              (None, 648)               6054      
=================================================================

person Des Grieux    schedule 11.06.2020    source источник
comment
Вам удалось решить проблему?   -  person segfault404    schedule 28.09.2020
comment
Я столкнулся с такой же проблемой, вам удалось ее решить?   -  person IS92    schedule 04.01.2021