Пример #1
0
 def testCrfSequenceScore(self):
     transition_params = np.array([[-3, 5, -2], [3, 4, 1], [1, 2, 1]],
                                  dtype=np.float32)
     # Test both the length-1 and regular cases.
     sequence_lengths_list = [
         np.array(3, dtype=np.int32),
         np.array(1, dtype=np.int32)
     ]
     inputs_list = [
         np.array([[4, 5, -3], [3, -1, 3], [-1, 2, 1], [0, 0, 0]],
                  dtype=np.float32),
         np.array([[4, 5, -3]], dtype=np.float32),
     ]
     tag_indices_list = [
         np.array([1, 2, 1, 0], dtype=np.int32),
         np.array([1], dtype=np.int32)
     ]
     for sequence_lengths, inputs, tag_indices in zip(
             sequence_lengths_list, inputs_list, tag_indices_list):
         with self.test_session() as sess:
             sequence_score = crf.crf_sequence_score(
                 inputs=array_ops.expand_dims(inputs, 0),
                 tag_indices=array_ops.expand_dims(tag_indices, 0),
                 sequence_lengths=array_ops.expand_dims(
                     sequence_lengths, 0),
                 transition_params=constant_op.constant(transition_params))
             sequence_score = array_ops.squeeze(sequence_score, [0])
             tf_sequence_score = sess.run(sequence_score)
             expected_unary_score = sum(inputs[i][tag_indices[i]]
                                        for i in range(sequence_lengths))
             expected_binary_score = sum(
                 transition_params[tag_indices[i], tag_indices[i + 1]]
                 for i in range(sequence_lengths - 1))
             expected_sequence_score = expected_unary_score + expected_binary_score
             self.assertAllClose(tf_sequence_score, expected_sequence_score)
Пример #2
0
 def testCrfSequenceScore(self):
   transition_params = np.array(
       [[-3, 5, -2], [3, 4, 1], [1, 2, 1]], dtype=np.float32)
   # Test both the length-1 and regular cases.
   sequence_lengths_list = [
       np.array(3, dtype=np.int32),
       np.array(1, dtype=np.int32)
   ]
   inputs_list = [
       np.array([[4, 5, -3], [3, -1, 3], [-1, 2, 1], [0, 0, 0]],
                dtype=np.float32),
       np.array([[4, 5, -3]],
                dtype=np.float32),
   ]
   tag_indices_list = [
       np.array([1, 2, 1, 0], dtype=np.int32),
       np.array([1], dtype=np.int32)
   ]
   for sequence_lengths, inputs, tag_indices in zip(sequence_lengths_list,
                                                    inputs_list,
                                                    tag_indices_list):
     with self.test_session() as sess:
       sequence_score = crf.crf_sequence_score(
           inputs=array_ops.expand_dims(inputs, 0),
           tag_indices=array_ops.expand_dims(tag_indices, 0),
           sequence_lengths=array_ops.expand_dims(sequence_lengths, 0),
           transition_params=constant_op.constant(transition_params))
       sequence_score = array_ops.squeeze(sequence_score, [0])
       tf_sequence_score = sess.run(sequence_score)
       expected_sequence_score = self.calculateSequenceScore(
           inputs, transition_params, tag_indices, sequence_lengths)
       self.assertAllClose(tf_sequence_score, expected_sequence_score)
Пример #3
0
  def testCrfLogNorm(self):
    inputs = np.array(
        [[4, 5, -3], [3, -1, 3], [-1, 2, 1], [0, 0, 0]], dtype=np.float32)
    transition_params = np.array(
        [[-3, 5, -2], [3, 4, 1], [1, 2, 1]], dtype=np.float32)
    num_words = inputs.shape[0]
    num_tags = inputs.shape[1]
    sequence_lengths = np.array(3, dtype=np.int32)
    with self.test_session() as sess:
      all_sequence_scores = []

      # Compare the dynamic program with brute force computation.
      for tag_indices in itertools.product(
          range(num_tags), repeat=sequence_lengths):
        tag_indices = list(tag_indices)
        tag_indices.extend([0] * (num_words - sequence_lengths))
        all_sequence_scores.append(
            crf.crf_sequence_score(
                inputs=array_ops.expand_dims(inputs, 0),
                tag_indices=array_ops.expand_dims(tag_indices, 0),
                sequence_lengths=array_ops.expand_dims(sequence_lengths, 0),
                transition_params=constant_op.constant(transition_params)))

      brute_force_log_norm = math_ops.reduce_logsumexp(all_sequence_scores)
      log_norm = crf.crf_log_norm(
          inputs=array_ops.expand_dims(inputs, 0),
          sequence_lengths=array_ops.expand_dims(sequence_lengths, 0),
          transition_params=constant_op.constant(transition_params))
      log_norm = array_ops.squeeze(log_norm, [0])
      tf_brute_force_log_norm, tf_log_norm = sess.run(
          [brute_force_log_norm, log_norm])

      self.assertAllClose(tf_log_norm, tf_brute_force_log_norm)
Пример #4
0
    def testCrfLogNorm(self):
        transition_params = np.array([[-3, 5, -2], [3, 4, 1], [1, 2, 1]],
                                     dtype=np.float32)
        # Test both the length-1 and regular cases.
        sequence_lengths_list = [
            np.array(3, dtype=np.int32),
            np.array(1, dtype=np.int32)
        ]
        inputs_list = [
            np.array([[4, 5, -3], [3, -1, 3], [-1, 2, 1], [0, 0, 0]],
                     dtype=np.float32),
            np.array([[3, -1, 3]], dtype=np.float32),
        ]
        tag_indices_list = [
            np.array([1, 2, 1, 0], dtype=np.int32),
            np.array([2], dtype=np.int32)
        ]

        for sequence_lengths, inputs, tag_indices in zip(
                sequence_lengths_list, inputs_list, tag_indices_list):
            num_words = inputs.shape[0]
            num_tags = inputs.shape[1]
            with self.test_session() as sess:
                all_sequence_scores = []

                # Compare the dynamic program with brute force computation.
                for tag_indices in itertools.product(range(num_tags),
                                                     repeat=sequence_lengths):
                    tag_indices = list(tag_indices)
                    tag_indices.extend([0] * (num_words - sequence_lengths))
                    all_sequence_scores.append(
                        crf.crf_sequence_score(
                            inputs=array_ops.expand_dims(inputs, 0),
                            tag_indices=array_ops.expand_dims(tag_indices, 0),
                            sequence_lengths=array_ops.expand_dims(
                                sequence_lengths, 0),
                            transition_params=constant_op.constant(
                                transition_params)))

                brute_force_log_norm = math_ops.reduce_logsumexp(
                    all_sequence_scores)
                log_norm = crf.crf_log_norm(
                    inputs=array_ops.expand_dims(inputs, 0),
                    sequence_lengths=array_ops.expand_dims(
                        sequence_lengths, 0),
                    transition_params=constant_op.constant(transition_params))
                log_norm = array_ops.squeeze(log_norm, [0])
                tf_brute_force_log_norm, tf_log_norm = sess.run(
                    [brute_force_log_norm, log_norm])

                self.assertAllClose(tf_log_norm, tf_brute_force_log_norm)
Пример #5
0
    def testCrfDecode(self):
        inputs = np.array([[4, 5, -3], [3, -1, 3], [-1, 2, 1], [0, 0, 0]],
                          dtype=np.float32)
        transition_params = np.array([[-3, 5, -2], [3, 4, 1], [1, 2, 1]],
                                     dtype=np.float32)
        sequence_lengths = np.array(3, dtype=np.int32)
        num_words = inputs.shape[0]
        num_tags = inputs.shape[1]

        with self.test_session() as sess:
            all_sequence_scores = []
            all_sequences = []

            # Compare the dynamic program with brute force computation.
            for tag_indices in itertools.product(range(num_tags),
                                                 repeat=sequence_lengths):
                tag_indices = list(tag_indices)
                tag_indices.extend([0] * (num_words - sequence_lengths))
                all_sequences.append(tag_indices)
                sequence_score = crf.crf_sequence_score(
                    inputs=array_ops.expand_dims(inputs, 0),
                    tag_indices=array_ops.expand_dims(tag_indices, 0),
                    sequence_lengths=array_ops.expand_dims(
                        sequence_lengths, 0),
                    transition_params=constant_op.constant(transition_params))
                sequence_score = array_ops.squeeze(sequence_score, [0])
                all_sequence_scores.append(sequence_score)

            tf_all_sequence_scores = sess.run(all_sequence_scores)

            expected_max_sequence_index = np.argmax(tf_all_sequence_scores)
            expected_max_sequence = all_sequences[expected_max_sequence_index]
            expected_max_score = tf_all_sequence_scores[
                expected_max_sequence_index]

            actual_max_sequence, actual_max_score = crf.crf_decode(
                array_ops.expand_dims(inputs, 0),
                constant_op.constant(transition_params),
                array_ops.expand_dims(sequence_lengths, 0))
            actual_max_sequence = array_ops.squeeze(actual_max_sequence, [0])
            actual_max_score = array_ops.squeeze(actual_max_score, [0])
            tf_actual_max_sequence, tf_actual_max_score = sess.run(
                [actual_max_sequence, actual_max_score])

            self.assertAllClose(tf_actual_max_score, expected_max_score)
            self.assertEqual(list(tf_actual_max_sequence[:sequence_lengths]),
                             expected_max_sequence[:sequence_lengths])
Пример #6
0
  def testCrfDecode(self):
    inputs = np.array(
        [[4, 5, -3], [3, -1, 3], [-1, 2, 1], [0, 0, 0]], dtype=np.float32)
    transition_params = np.array(
        [[-3, 5, -2], [3, 4, 1], [1, 2, 1]], dtype=np.float32)
    sequence_lengths = np.array(3, dtype=np.int32)
    num_words = inputs.shape[0]
    num_tags = inputs.shape[1]

    with self.test_session() as sess:
      all_sequence_scores = []
      all_sequences = []

      # Compare the dynamic program with brute force computation.
      for tag_indices in itertools.product(
          range(num_tags), repeat=sequence_lengths):
        tag_indices = list(tag_indices)
        tag_indices.extend([0] * (num_words - sequence_lengths))
        all_sequences.append(tag_indices)
        sequence_score = crf.crf_sequence_score(
            inputs=array_ops.expand_dims(inputs, 0),
            tag_indices=array_ops.expand_dims(tag_indices, 0),
            sequence_lengths=array_ops.expand_dims(sequence_lengths, 0),
            transition_params=constant_op.constant(transition_params))
        sequence_score = array_ops.squeeze(sequence_score, [0])
        all_sequence_scores.append(sequence_score)

      tf_all_sequence_scores = sess.run(all_sequence_scores)

      expected_max_sequence_index = np.argmax(tf_all_sequence_scores)
      expected_max_sequence = all_sequences[expected_max_sequence_index]
      expected_max_score = tf_all_sequence_scores[expected_max_sequence_index]

      actual_max_sequence, actual_max_score = crf.crf_decode(
          array_ops.expand_dims(inputs, 0),
          constant_op.constant(transition_params),
          array_ops.expand_dims(sequence_lengths, 0))
      actual_max_sequence = array_ops.squeeze(actual_max_sequence, [0])
      actual_max_score = array_ops.squeeze(actual_max_score, [0])
      tf_actual_max_sequence, tf_actual_max_score = sess.run(
          [actual_max_sequence, actual_max_score])

      self.assertAllClose(tf_actual_max_score, expected_max_score)
      self.assertEqual(list(tf_actual_max_sequence[:sequence_lengths]),
                       expected_max_sequence[:sequence_lengths])
Пример #7
0
 def testCrfSequenceScore(self):
   inputs = np.array(
       [[4, 5, -3], [3, -1, 3], [-1, 2, 1], [0, 0, 0]], dtype=np.float32)
   tag_indices = np.array([1, 2, 1, 0], dtype=np.int32)
   transition_params = np.array(
       [[-3, 5, -2], [3, 4, 1], [1, 2, 1]], dtype=np.float32)
   sequence_lengths = np.array(3, dtype=np.int32)
   with self.test_session() as sess:
     sequence_score = crf.crf_sequence_score(
         inputs=array_ops.expand_dims(inputs, 0),
         tag_indices=array_ops.expand_dims(tag_indices, 0),
         sequence_lengths=array_ops.expand_dims(sequence_lengths, 0),
         transition_params=constant_op.constant(transition_params))
     sequence_score = array_ops.squeeze(sequence_score, [0])
     tf_sequence_score = sess.run(sequence_score)
     expected_unary_score = sum(inputs[i][tag_indices[i]]
                                for i in range(sequence_lengths))
     expected_binary_score = sum(
         transition_params[tag_indices[i], tag_indices[i + 1]]
         for i in range(sequence_lengths - 1))
     expected_sequence_score = expected_unary_score + expected_binary_score
     self.assertAllClose(tf_sequence_score, expected_sequence_score)