loss函数在CRF keras contrib的联接模式下返回Nan

loss函数在CRF keras contrib的联接模式下返回Nan,keras,loss-function,crf,Keras,Loss Function,Crf,我使用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) lst

我使用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])
我使用kerascontrib包实现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

我不明白为什么会发生这种情况,如果有人能给我一个提示,我将不胜感激。

面对类似的问题(不同的网络和工作,但也有损失),我发现了以下几页:这种情况可能是由于渐变减小或渐变爆炸造成的,为了解决这个问题,你应该调整学习率,或者你可以在每个历元后将学习率降低一小部分。