Я использую архитектуру 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
Я не понимаю, почемуэто происходит и был бы благодарен любому, кто мог бы дать подсказку.