实体命名识别详解(十三)

   self.add_pred_op()

接下来是add_pred_op操作,看字面意思是预测用。

    def add_pred_op(self):
        """Defines self.labels_pred

        This op is defined only in the case where we don't use a CRF since in
        that case we can make the prediction "in the graph" (thanks to tf
        functions in other words). With theCRF, as the inference is coded
        in python and not in pure tensroflow, we have to make the prediciton
        outside the graph.
        """
        if not self.config.use_crf:
            self.labels_pred = tf.cast(tf.argmax(self.logits, axis=-1),
                    tf.int32)

 定义self中的标签预测操作,看函数体的介绍:只有当我们不打算使用CRF做预测时才使用此函数,看函数,if not self.config.use_crf再执行,这里先是一个TensorFlow的argmax函数,返回最后一列每行最大的元素,也就是预测值最高的那个标签选项。外边套一个TensorFlow的cast函数,用于将其转换为int32类型。很好理解,,,不过在这里,config实例中的use_crf设置为True,所以该函数布执行。

   self.add_loss_op()

这里执行loss操作,也就是计算损失函数。

    def add_loss_op(self):
        """Defines the loss"""
        if self.config.use_crf:
            log_likelihood, trans_params = tf.contrib.crf.crf_log_likelihood(
                    self.logits, self.labels, self.sequence_lengths)
            self.trans_params = trans_params # need to evaluate it for decoding
            self.loss = tf.reduce_mean(-log_likelihood)
        else:
            losses = tf.nn.sparse_softmax_cross_entropy_with_logits(
                    logits=self.logits, labels=self.labels)
            mask = tf.sequence_mask(self.sequence_lengths)
            losses = tf.boolean_mask(losses, mask)
            self.loss = tf.reduce_mean(losses)

        # for tensorboard
        tf.summary.scalar("loss", self.loss)

 这里首先判断是否使用crf方法(条件随机场),是的话紧跟一个TensorFlow.contrib.crf.crf_log_likelihood()方法,这个函数的作用是,使用crf来计算损失,里面用到的优化方法是极大似然优化,这里对cfr.crf_log_likelihood()做一个简要介绍。

tf.contrib.crf.crf_log_likelihood(inputs, tag_indices, sequence_lengths, transition_params=None)
See the guide: CRF (contrib)

Computes the log-likelihood of tag sequences in a CRF.

Args:
inputs: A [batch_size, max_seq_len, num_tags] tensor of unary potentials to use as input to the CRF layer.
tag_indices: A [batch_size, max_seq_len] matrix of tag indices for which we compute the log-likelihood.
sequence_lengths: A [batch_size] vector of true sequence lengths.
transition_params: A [num_tags, num_tags] transition matrix, if available. Returns:
log_likelihood: A scalar containing the log-likelihood of the given sequence of tag indices.
transition_params: A [num_tags, num_tags] transition matrix. This is either provided by the caller or created in this function.

crf_log_likelihood(inputs,tag_indices,sequence_lengths,transition_params=None)
在一个条件随机场里面计算标签序列的log-likelihood。

参数

inputs: 一个形状为[batch_size, max_seq_len, num_tags] 的tensor,一般使用BILSTM处理之后输出转换为他
要求的形状作为CRF层的输入. 
tag_indices: 一个形状为[batch_size, max_seq_len] 的矩阵,其实就是真实标签. 
sequence_lengths: 一个形状为 [batch_size] 的向量,表示每个序列的长度. 
transition_params: 形状为[num_tags, num_tags] 的转移矩阵

返回

log_likelihood: 标量,log-likelihood 
transition_params: 形状为[num_tags, num_tags] 的转移矩阵

所以,最后使用reduce_mean来进行损失函数优化。
倘若未使用crf优化,就执行接下来的else操作,这里使用交叉熵来计算损失值,然后使用sequence_mask函数根据sequence_length建立mask,返回shape形状的bool类型值,即只有TRUE和FALSE的张量空间。然后一个boolean_mask。。。这他妈都是在干啥!!气死了我不懂,,最后返回self.loss,最后呢再用TensorFlow.summary.sacler(),根据损失值loss绘制标量图像。

你可能感兴趣的:(实体命名识别详解(十三))