Keras - CRF contrib выдает ошибку: ValueError: ('Не удалось интерпретировать идентификатор функции потери:', ‹объект свойства в 0x000002477F1B82C8›)

Я пытаюсь добавить слой crf в свою функциональную модель, но получаю эту ошибку, которую не могу решить:

ValueError: ('Не удалось интерпретировать идентификатор функции потерь:',)

Слой CRF происходит из пакета keras contribs.

Модель:

from keras_contrib.layers import CRF


inputs = Input(shape=(MAX_LENGTH,))

embedding = Embedding(VOCAB_SIZE +1, EMBEDDING_SIZE, mask_zero= True)(inputs)

left = LSTM(HIDDEN_SIZE, return_sequences=True)(embedding)
right = LSTM(HIDDEN_SIZE, go_backwards=True, return_sequences=True)(embedding)
left_right = concatenate([left, right])

left2 = LSTM(HIDDEN_SIZE, return_sequences=True)(embedding)
right2 = LSTM(HIDDEN_SIZE, go_backwards=True, return_sequences=True)(embedding)
left_right2 = concatenate([left2, right2])

left_right_combi = add([left_right, left_right2])

left_right_combii = TimeDistributed(Dense(NUM_LABELS, activation='softmax'))\
(left_right_combi)


crf = CRF(NUM_LABELS, sparse_target=True)(left_right_combii)

combined_model = Model(inputs=inputs, outputs=crf)
combined_model.compile(loss=CRF.loss_function, optimizer='adam', metrics=[CRF.accuracy])

Если я использую "нормальную" функцию потерь и метрику, я получаю такую ​​ошибку:

combined_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

«ValueError: операция имеет None для градиента. Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (т.е. дифференцируемы). Общие операции без градиента: K.argmax, K.round, K.eval.»

Есть идеи, как правильно использовать слой crf?

Спасибо :)


person L.Berlanda    schedule 25.04.2018    source источник
comment
Мы не можем запустить этот пример, класс CRF не определен, вам нужно лучше объяснить проблему, чтобы кто-нибудь мог дать ответ.   -  person Dr. Snoopy    schedule 25.04.2018
comment
@Matias Valdenegro К сожалению, я не могу предоставить данные, поэтому вы все равно не можете запустить код. Если класс CRF не определен, вам необходимо установить CRF из пакета Keras contribs.   -  person L.Berlanda    schedule 30.04.2018


Ответы (2)


вы должны импортировать crf_loss и crf_accuracy, чтобы правильно использовать слой CRF

в заключение это будет выглядеть так:

from keras_contrib.losses import crf_loss
from keras_contrib.metrics import crf_accuracy
#.
#.
#.
model.compile(optimizer="adam", loss=crf_loss, metrics=[crf_accuracy])

вы также можете увидеть этот пример от Кераса вклад GitHub.

person Amin Taheri    schedule 28.08.2019

Уровень CRF в keras-contrib ожидает crf_loss при использовании в learn_mode = 'join' (режим по умолчанию). Если вы хотите использовать любую другую нормальную функцию потерь, например кроссэнтропию, вы должны установить learn_mode = 'marginal' при создании экземпляра.

crf=CRF(<classes>,learn_mode='marginal')

person Prady_venom    schedule 11.01.2020