Функция потерь возвращает Nan в режиме соединения с CRF keras-contrib - PullRequest
0 голосов
/ 26 ноября 2018

Я использую архитектуру BiLSTM-CRF, чтобы назначить некоторые метки последовательности предложений в статье.У нас есть 150 статей, каждая из которых содержит 380 предложений, и каждое предложение представлено двойным массивом с размером 11 в диапазоне (0,1) и количеством меток классов: 11.

input = Input(shape=(None,11))
mask = Masking (mask_value=0)(input)
lstm = Bidirectional(LSTM(50, return_sequences=True))(mask)
lstm = Dropout(0.3)(lstm)
lstm= TimeDistributed(Dense(50, activation="relu"))(lstm)
crf = CRF(11 , sparse_target=False , learn_mode='join')  # CRF layer
out = crf(lstm)
model = Model(input, out)
model.summary()
model.compile('adam', loss=crf.loss_function, metrics=[crf.accuracy])

Я использую керасы-contrib пакет для реализации уровня CRF.Слой CRF имеет два режима обучения: режим соединения и маргинальный режим.Я знаю, что режим соединения - это настоящая CRF, которая использует алгоритм Витерби для прогнозирования наилучшего пути.В то время как маргинальный режим не является реальным CRF, который использует категориальную кроссцентропию для вычисления функции потерь.Когда я использую маржинальный режим, вывод выглядит следующим образом:

Epoch 4/250:  - 6s - loss: 1.2289 - acc: 0.5657 - val_loss: 1.3459 - val_acc: 0.5262

Но в режиме соединения значение функции потерь равно nan:

Epoch 2/250 :  - 5s - loss: nan - acc: 0.1880 - val_loss: nan - val_acc: 0.2120

Я не понимаю, почемуэто происходит и был бы благодарен любому, кто мог бы дать подсказку.

...