Skip to content

关于chapter8的Crf的问题 #5

@hjing100

Description

@hjing100
def loss_layer(self, project_logits, lengths, name=None):
    """
    计算CRF的loss
    :param project_logits: [1, num_steps, num_tags]
    :return: scalar loss
    """
    with tf.name_scope("crf_loss" if not name else name):
        small = -1000.0
        # pad logits for crf loss
        start_logits = tf.concat(
            [small * tf.ones(shape=[self.batch_size, 1, self.relation_num]), tf.zeros(shape=[self.batch_size, 1, 1])],
            axis=-1)
        pad_logits = tf.cast(small * tf.ones([self.batch_size, self.num_steps, 1]), tf.float32)
        logits = tf.concat([project_logits, pad_logits], axis=-1)
        logits = tf.concat([start_logits, logits], axis=1)
        targets = tf.concat(
            [tf.cast(self.relation_num * tf.ones([self.batch_size, 1]), tf.int32), self.input_relation], axis=-1)

        self.trans = tf.get_variable(
            name="transitions",
            shape=[self.relation_num + 1, self.relation_num + 1],  # 1
            # shape=[self.relation_num, self.relation_num],  # 1
            initializer=self.initializer)
        log_likelihood, self.trans = crf_log_likelihood(
            inputs=logits,
            tag_indices=targets,
            # tag_indices=self.input_relation,
            transition_params=self.trans,
            # sequence_lengths=lengths
            sequence_lengths=lengths + 1
        )  # + 1
        return tf.reduce_mean(-log_likelihood, name='loss')

你好,
请问这里为什么要+1?
start_logits 是什么?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions