我正在使用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的实例变量中?
答案 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)