1、踩了个大坑,记录一下
声明:不喜欢写estimator所以才踩的坑
1、from tensorflow.contrib import crf 如果想使用这个函数,tensorflow的版本号要在1.14以下,1.12就可以,不要相信那些乱七八糟要求各种版本的
2、
log_likelihood, trans = tf.contrib.crf.crf_log_likelihood( inputs=logits, tag_indices=self.labels, sequence_lengths=self.lengths, transition_params=trans) return tf.reduce_mean(-log_likelihood)=loss, trans
pred_ids, _ = crf.crf_decode(potentials=logits, transition_params=trans, sequence_length=self.lengths)
crf函数可以返回函数的损失,转移矩阵,最有路径的结果,我们要根据最有路径的结果与原始标签来计算acc和recall
3、input_label是真实标签(?*100)?表示batch_size的大小;pred_ids是预测标签(?*100)?表示batch_size的大小
acc = a(预测为实体且真实为实体的个数)/b(预测为实体的个数)
recall = a(预测为实体且真实为实体的个数)/c(实际实体的个数)
首先你要知道你实体的标签id是什么,如["O", "B-person", "CLS", "Seq"],那么你的标签id就是1
先计算a,思路步骤:
1、input_label中元素为1,2,3的位置置true,其余位置false,并转换成float。mid_1_1 = tf.cast(tf.equal(self.input_label, 1),tf.float32)
2、input_label和pred_ids中相同位置元素相同置true,否则置false,与转换成flaot。mid_1 = tf.cast(tf.equal(self.input_label, self.pred_ids),tf.float32)
3、两个相乘得到的结果就是a。mid_1_1_1 = tf.reduce_sum(tf.multiply(mid_1_1, mid_1))
计算b,思路步骤:
1、计算pred_ids中为实体的元素位置:mid_2_1 = tf.equal(self.pred_ids, 1)
2、recall_ner = tf.reduce_sum(tf.cast(mid_2_1, tf.float32))
计算c,思路步骤:true_ner = tf.reduce_sum(tf.cast(mid_1_1, tf.float32))
acc还是precision我记不清了
acc = a/b
recall = a/c