损失函数以CRF keras-contrib的联接模式返回Nan

时间:2018-11-26 16:07:03

标签: keras loss-function crf

我使用BiLSTM-CRF体系结构为论文中的句子序列分配一些标签。我们有150篇论文,每篇论文包含380个句子,每个句子由一个双精度数组表示,其范围为(0,1),大小为11,类别标签的数量为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])

我使用keras-contrib包来实现CRF层。 CRF层有两种学习模式:连接模式和边缘模式。我知道联接模式是一个真正的CRF,它使用viterbi算法来预测最佳路径。而边际模式不是使用分类交叉熵来计算损失函数的真实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

我不明白为什么会发生这种情况,并感谢任何可以提出提示的人。

0 个答案:

没有答案