我使用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
我不明白为什么会发生这种情况,并感谢任何可以提出提示的人。