如何将损失函数中的变量存储到实例变量中

时间:2017-08-14 03:21:05

标签: python machine-learning tensorflow nlp keras

我正在使用Keras和Tensorflow。 由于我想创建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的实例变量中?

1 个答案:

答案 0 :(得分:2)

问题是错误的函数签名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)