我在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)