Ejemplo n.º 1
0
 def test_enforce_noshuffle(self):
     """Test when we enforce uniqueness, but do not shuffle."""
     (concatenated_train_sequence,
      concatenated_train_cluster_id) = utils.concatenate_training_data(
          self.train_sequences, self.train_cluster_ids, True, False)
     self.assertListEqual([0.0] * 6 + [1.0] * 8,
                          concatenated_train_sequence.flatten().tolist())
     self.assertEqual(7, len(concatenated_train_cluster_id))
     self.assertEqual(5, len(set(concatenated_train_cluster_id)))
Ejemplo n.º 2
0
 def test_noenforce_noshuffle(self):
     """Test when we do not enforce uniqueness, and do not shuffle."""
     (concatenated_train_sequence,
      concatenated_train_cluster_id) = utils.concatenate_training_data(
          self.train_sequences, self.train_cluster_ids, False, False)
     self.assertListEqual([0.0] * 6 + [1.0] * 8,
                          concatenated_train_sequence.flatten().tolist())
     self.assertListEqual(['a', 'b', 'a', 'a', 'b', 'c', 'b'],
                          concatenated_train_cluster_id)
Ejemplo n.º 3
0
    def fit(self, train_sequences, train_cluster_ids, args):
        """Fit UISRNN model.

    Args:
      train_sequences: Either a list of training sequences, or a single
        concatenated training sequence:

          (1) train_sequences is list, and each element is a 2-dim numpy array
              of real numbers, of size size: length * D.
              The length varies among differnt sequences, but the D is the same.
              In speaker diarization, each sequence is the sequence of speaker
              embeddings of one utterance.

          (2) train_sequences is a single concatenated sequence, which is a
              2-dim numpy array of real numbers. See _fit_concatenated()
              for more details.

      train_cluster_ids: Ground truth labels for train_sequences:

          (1) if train_sequences is a list, this must also be a list of the same
              size, each element being a 1-dim list or numpy array of strings.

          (2) if train_sequences is a single concatenated sequence, this
              must also be the concatenated 1-dim list or numpy array of strings

      args: Training configurations. See arguments.py for details.

    Raises:
      TypeError: If train_sequences or train_cluster_ids is of wrong type.
    """
        if isinstance(train_sequences, np.ndarray):
            # train_sequences is already the concatenated sequence
            concatenated_train_sequence = train_sequences
            concatenated_train_cluster_id = train_cluster_ids
        elif isinstance(train_sequences, list):
            # train_sequences is a list of un-concatenated sequences,
            # then we concatenate them first
            (concatenated_train_sequence,
             concatenated_train_cluster_id) = utils.concatenate_training_data(
                 train_sequences, train_cluster_ids,
                 args.enforce_cluster_id_uniqueness, True)
        else:
            raise TypeError('train_sequences must be a list or numpy.ndarray')

        self._fit_concatenated(concatenated_train_sequence,
                               concatenated_train_cluster_id, args)
Ejemplo n.º 4
0
 def test_noenforce_shuffle(self):
     """Test when we do not enforce uniqueness, but do shuffle."""
     (concatenated_train_sequence,
      concatenated_train_cluster_id) = utils.concatenate_training_data(
          self.train_sequences, self.train_cluster_ids, False, True)
     try:
         self.assertListEqual(
             [0.0] * 6 + [1.0] * 8,
             concatenated_train_sequence.flatten().tolist())
         self.assertListEqual(['a', 'b', 'a', 'a', 'b', 'c', 'b'],
                              concatenated_train_cluster_id)
     except AssertionError:
         self.assertListEqual(
             [1.0] * 8 + [0.0] * 6,
             concatenated_train_sequence.flatten().tolist())
         self.assertListEqual(['a', 'b', 'c', 'b', 'a', 'b', 'a'],
                              concatenated_train_cluster_id)
Ejemplo n.º 5
0
    def fit(self, train_sequences, train_cluster_ids, args):
        """Fit UISRNN model.

    Args:
      train_sequences: Either a list of training sequences, or a single
        concatenated training sequence:

        1. train_sequences is list, and each element is a 2-dim numpy array
           of real numbers, of size: `length * D`.
           The length varies among different sequences, but the D is the same.
           In speaker diarization, each sequence is the sequence of speaker
           embeddings of one utterance.
        2. train_sequences is a single concatenated sequence, which is a
           2-dim numpy array of real numbers. See `fit_concatenated()`
           for more details.
      train_cluster_ids: Ground truth labels for train_sequences:

        1. if train_sequences is a list, this must also be a list of the same
           size, each element being a 1-dim list or numpy array of strings.
        2. if train_sequences is a single concatenated sequence, this
           must also be the concatenated 1-dim list or numpy array of strings
      args: Training configurations. See `arguments.py` for details.

    Raises:
      TypeError: If train_sequences or train_cluster_ids is of wrong type.
    """
        if isinstance(train_sequences, np.ndarray):
            # train_sequences is already the concatenated sequence
            if self.estimate_transition_bias:
                # see issue #55: https://github.com/google/uis-rnn/issues/55
                self.logger.print(
                    2,
                    'Warning: transition_bias cannot be correctly estimated from a '
                    'concatenated sequence; train_sequences will be treated as a '
                    'single sequence. This can lead to inaccurate estimation of '
                    'transition_bias. Please, consider estimating transition_bias '
                    'before concatenating the sequences and passing it as argument.'
                )
            train_sequences = [train_sequences]
            train_cluster_ids = [train_cluster_ids]
        elif isinstance(train_sequences, list):
            # train_sequences is a list of un-concatenated sequences
            # we will concatenate it later, after estimating transition_bias
            pass
        else:
            raise TypeError('train_sequences must be a list or numpy.ndarray')

        # estimate transition_bias
        if self.estimate_transition_bias:
            (transition_bias, transition_bias_denominator
             ) = utils.estimate_transition_bias(train_cluster_ids)
            # set or update transition_bias
            if self.transition_bias is None:
                self.transition_bias = transition_bias
                self.transition_bias_denominator = transition_bias_denominator
            else:
                self.transition_bias = (
                    self.transition_bias * self.transition_bias_denominator +
                    transition_bias * transition_bias_denominator) / (
                        self.transition_bias_denominator +
                        transition_bias_denominator)
                self.transition_bias_denominator += transition_bias_denominator

        # concatenate train_sequences
        (concatenated_train_sequence,
         concatenated_train_cluster_id) = utils.concatenate_training_data(
             train_sequences, train_cluster_ids,
             args.enforce_cluster_id_uniqueness, True)

        self.fit_concatenated(concatenated_train_sequence,
                              concatenated_train_cluster_id, args)
Ejemplo n.º 6
0
        if i <= train_cases:
            train_cluster_id.append(train_clus[j])
        else:
            train_cluster_id.append(list(map(int, train_clus[j])))

    if False:
        print('Processed case:', case_id)
        print('emb shape:', np.shape(train_seq))
        print('label shape:', np.shape(train_clus))
        print('emb len:', len(train_sequence))
        print('label len:', len(train_cluster_id))

    if i <= train_cases:
        trn_seq_lst.append(train_sequence)
        trn_cluster_lst.append(train_cluster_id)
    else:
        test_seq_lst.append(train_sequence)
        test_cluster_lst.append(train_cluster_id)

from uisrnn import utils
item = 0
(concatenated_train_sequence,
 concatenated_train_cluster_id) = utils.concatenate_training_data(
     trn_seq_lst[item], trn_cluster_lst[item], False, False)

if verbose:
    print(type(concatenated_train_sequence),
          type(concatenated_train_sequence[0]))
    #print(np.shape(concatenated_train_sequence))
    print(np.shape(concatenated_train_sequence))