我在Tensorflow中使用Keras。
由于我要创建LSTM-CRF model,因此我使用tf.contrib.crf.crf_log_likelihood定义了自己的损失函数:

def loss(self, y_true, y_pred):
    sequence_lengths = ... # calc from 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中。

问题是在minibatch期间从未更新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)

08-25 01:11