我正在使用Keras和Tensorflow。由于我想创建LSTM-CRF模型,我使用tf.contrib.crf.crf_log_likelihood定义了自己的损失函数:
def loss(self, y_true, y_pred): sequence_lengths = ... # 从y_true计算 log_likelihood, transition_params = tf.contrib.crf.crf_log_likelihood(y_pred, y_true, sequence_lengths) loss = tf.reduce_mean(-log_likelihood) self.transition_params = transition_params return loss
众所周知,CRF在预测阶段需要转换参数。因此,我将transition_params存储到了实例变量self.transition_params中。
问题是self.transition_params在小批量处理期间从未被更新。根据我的观察,似乎它只在编译模型时存储了一次。
在Keras中,有没有办法将损失函数中的变量存储到实例变量中?
回答:
问题在于错误的函数签名tf.contrib.crf.crf_log_likelihood
,你需要传递transition_params
并使用当前的转换参数。以下更改将解决相同的问题。
log_likelihood, transition_params = tf.contrib.crf.crf_log_likelihood(y_pred, y_true, sequence_lengths, transition_params=self.transition_params)