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)))
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)
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)
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)
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)
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))