示例#1
0
    def train(self, n_epochs=1, save_every=1):

        while (self.cur_epoch < n_epochs):

            np.random.seed()
            self.train_loader.dataset.update_lists()

            if self.verbose > 0:
                print(' ')
                print('Epoch {}/{}'.format(self.cur_epoch + 1, n_epochs))
                print('Number of training examples given new list: {}'.format(
                    len(self.train_loader.dataset)))
                train_iter = tqdm(enumerate(self.train_loader),
                                  total=len(self.train_loader))
            else:
                train_iter = enumerate(self.train_loader)

            train_loss_epoch = 0.0

            if self.softmax and not self.pretrain:

                ce_epoch = 0.0
                for t, batch in train_iter:
                    train_loss, ce = self.train_step(batch)
                    self.history['train_loss_batch'].append(train_loss)
                    self.history['softmax_batch'].append(ce)
                    train_loss_epoch += train_loss
                    ce_epoch += ce
                    if self.logger:
                        self.logger.add_scalar('Train/Train Loss', train_loss,
                                               self.total_iters)
                        self.logger.add_scalar('Train/Triplet Loss',
                                               train_loss - ce,
                                               self.total_iters)
                        self.logger.add_scalar('Train/Cross enropy', ce,
                                               self.total_iters)
                        self.logger.add_scalar(
                            'Info/LR',
                            self.optimizer.optimizer.param_groups[0]['lr'],
                            self.total_iters)
                    self.total_iters += 1

                self.history['train_loss'].append(train_loss_epoch / (t + 1))
                self.history['softmax'].append(ce_epoch / (t + 1))

                if self.verbose > 0:
                    print(
                        'Total train loss, Triplet loss, and Cross-entropy: {:0.4f}, {:0.4f}, {:0.4f}'
                        .format(self.history['train_loss'][-1],
                                (self.history['train_loss'][-1] -
                                 self.history['softmax'][-1]),
                                self.history['softmax'][-1]))

            elif self.pretrain:

                ce_epoch = 0.0
                for t, batch in train_iter:
                    ce = self.pretrain_step(batch)
                    self.history['train_loss_batch'].append(ce)
                    ce_epoch += ce
                    if self.logger:
                        self.logger.add_scalar('Cross enropy', ce,
                                               self.total_iters)
                        self.logger.add_scalar(
                            'Info/LR',
                            self.optimizer.optimizer.param_groups[0]['lr'],
                            self.total_iters)
                    self.total_iters += 1

                self.history['train_loss'].append(ce_epoch / (t + 1))

                if self.verbose > 0:
                    print('Train loss: {:0.4f}'.format(
                        self.history['train_loss'][-1]))

            else:
                for t, batch in train_iter:
                    train_loss = self.train_step(batch)
                    self.history['train_loss_batch'].append(train_loss)
                    train_loss_epoch += train_loss
                    if self.logger:
                        self.logger.add_scalar('Train/Train Loss', train_loss,
                                               self.total_iters)
                        self.logger.add_scalar(
                            'Info/LR',
                            self.optimizer.optimizer.param_groups[0]['lr'],
                            self.total_iters)
                    self.total_iters += 1

                self.history['train_loss'].append(train_loss_epoch / (t + 1))

                if self.verbose > 0:
                    print('Total train loss, {:0.4f}'.format(
                        self.history['train_loss'][-1]))

            if self.valid_loader is not None:

                scores, labels, emb, y_ = None, None, None, None

                for t, batch in enumerate(self.valid_loader):
                    scores_batch, labels_batch, emb_batch, y_batch = self.valid(
                        batch)

                    try:
                        scores = np.concatenate([scores, scores_batch], 0)
                        labels = np.concatenate([labels, labels_batch], 0)
                        emb = np.concatenate([emb, emb_batch], 0)
                        y_ = np.concatenate([y_, y_batch], 0)
                    except:
                        scores, labels, emb, y_ = scores_batch, labels_batch, emb_batch, y_batch

                self.history['valid_loss'].append(compute_eer(labels, scores))
                if self.verbose > 0:
                    print(
                        'Current validation loss, best validation loss, and epoch: {:0.4f}, {:0.4f}, {}'
                        .format(self.history['valid_loss'][-1],
                                np.min(self.history['valid_loss']),
                                1 + np.argmin(self.history['valid_loss'])))
                if self.logger:
                    self.logger.add_scalar('Valid/EER',
                                           self.history['valid_loss'][-1],
                                           self.total_iters - 1)
                    self.logger.add_scalar('Valid/Best EER',
                                           np.min(self.history['valid_loss']),
                                           self.total_iters - 1)
                    self.logger.add_pr_curve('Valid. ROC',
                                             labels=labels,
                                             predictions=scores,
                                             global_step=self.total_iters - 1)

                    if emb.shape[0] > 20000:
                        idxs = np.random.choice(np.arange(emb.shape[0]),
                                                size=20000,
                                                replace=False)
                        emb, y_ = emb[idxs, :], y_[idxs]

                    self.logger.add_histogram('Valid/Embeddings',
                                              values=emb,
                                              global_step=self.total_iters - 1)
                    self.logger.add_histogram('Valid/Scores',
                                              values=scores,
                                              global_step=self.total_iters - 1)
                    self.logger.add_histogram('Valid/Labels',
                                              values=labels,
                                              global_step=self.total_iters - 1)

                    if self.verbose > 1:
                        self.logger.add_embedding(
                            mat=emb,
                            metadata=list(y_),
                            global_step=self.total_iters - 1)

            if self.verbose > 0:
                print('Current LR: {}'.format(
                    self.optimizer.optimizer.param_groups[0]['lr']))

            self.cur_epoch += 1

            if self.valid_loader is not None and self.save_cp and (
                    self.cur_epoch % save_every == 0
                    or self.history['valid_loss'][-1] <
                    np.min([np.inf] + self.history['valid_loss'][:-1])):
                self.checkpointing()
            elif self.save_cp and self.cur_epoch % save_every == 0:
                self.checkpointing()

        if self.verbose > 0:
            print('Training done!')

        if self.valid_loader is not None:
            if self.verbose > 0:
                print(
                    'Best validation loss and corresponding epoch: {:0.4f}, {}'
                    .format(np.min(self.history['valid_loss']),
                            1 + np.argmin(self.history['valid_loss'])))

            return np.min(self.history['valid_loss'])
        else:
            return np.min(self.history['train_loss'])
示例#2
0
	def train(self, n_epochs=1, save_every=1):

		while (self.cur_epoch < n_epochs):

			np.random.seed()
			self.train_loader.dataset.update_lists()

			if self.verbose>1:
				print(' ')
				print('Epoch {}/{}'.format(self.cur_epoch+1, n_epochs))
				print('Number of training examples given new list: {}'.format(len(self.train_loader.dataset)))
				train_iter = tqdm(enumerate(self.train_loader), total=len(self.train_loader))
			else:
				train_iter = enumerate(self.train_loader)

			if self.pretrain:

				ce_epoch=0.0
				for t, batch in train_iter:
					ce = self.pretrain_step(batch)
					self.history['train_loss_batch'].append(ce)
					ce_epoch+=ce
					if self.logger:
						self.logger.add_scalar('Train/Cross entropy', ce, self.total_iters)
						self.logger.add_scalar('Info/LR', self.optimizer.optimizer.param_groups[0]['lr'], self.total_iters)

					self.total_iters += 1

				self.history['train_loss'].append(ce_epoch/(t+1))

				if self.verbose>1:
					print('Train loss: {:0.4f}'.format(self.history['train_loss'][-1]))

			else:

				train_loss_epoch=0.0
				ce_loss_epoch=0.0
				bin_loss_epoch=0.0
				for t, batch in train_iter:
					train_loss, ce_loss, bin_loss = self.train_step(batch)
					self.history['train_loss_batch'].append(train_loss)
					self.history['ce_loss_batch'].append(ce_loss)
					self.history['bin_loss_batch'].append(bin_loss)
					train_loss_epoch+=train_loss
					ce_loss_epoch+=ce_loss
					bin_loss_epoch+=bin_loss
					if self.logger:
						self.logger.add_scalar('Train/Total train Loss', train_loss, self.total_iters)
						self.logger.add_scalar('Train/Binary class. Loss', bin_loss, self.total_iters)
						self.logger.add_scalar('Train/Cross enropy', ce_loss, self.total_iters)
						self.logger.add_scalar('Info/LR', self.optimizer.optimizer.param_groups[0]['lr'], self.total_iters)

					self.total_iters += 1

				self.history['train_loss'].append(train_loss_epoch/(t+1))
				self.history['ce_loss'].append(ce_loss_epoch/(t+1))
				self.history['bin_loss'].append(bin_loss_epoch/(t+1))

				if self.verbose>1:
					print(' ')
					print('Total train loss: {:0.4f}'.format(self.history['train_loss'][-1]))
					print('CE loss: {:0.4f}'.format(self.history['ce_loss'][-1]))
					print('Binary classification loss: {:0.4f}'.format(self.history['bin_loss'][-1]))
					print(' ')

			if self.valid_loader is not None:

				e2e_scores, cos_scores, labels, emb, y_ = None, None, None, None, None

				for t, batch in enumerate(self.valid_loader):
					e2e_scores_batch, cos_scores_batch, labels_batch, emb_batch, y_batch = self.valid(batch)

					try:
						e2e_scores = np.concatenate([e2e_scores, e2e_scores_batch], 0)
						cos_scores = np.concatenate([cos_scores, cos_scores_batch], 0)
						labels = np.concatenate([labels, labels_batch], 0)
						emb = np.concatenate([emb, emb_batch], 0)
						y_ = np.concatenate([y_, y_batch], 0)
					except:
						e2e_scores, cos_scores, labels, emb, y_ = e2e_scores_batch, cos_scores_batch, labels_batch, emb_batch, y_batch

				fus_scores = (e2e_scores + 0.5*(cos_scores+1.))*0.5

				self.history['e2e_eer'].append(compute_eer(labels, e2e_scores))
				self.history['cos_eer'].append(compute_eer(labels, cos_scores))
				self.history['fus_eer'].append(compute_eer(labels, fus_scores))

				if self.logger:
					self.logger.add_scalar('Valid/E2E EER', self.history['e2e_eer'][-1], self.total_iters-1)
					self.logger.add_scalar('Valid/Best E2E EER', np.min(self.history['e2e_eer']), self.total_iters-1)
					self.logger.add_scalar('Valid/Cosine EER', self.history['cos_eer'][-1], self.total_iters-1)
					self.logger.add_scalar('Valid/Best Cosine EER', np.min(self.history['cos_eer']), self.total_iters-1)
					self.logger.add_scalar('Valid/Fus EER', self.history['fus_eer'][-1], self.total_iters-1)
					self.logger.add_scalar('Valid/Best Fus EER', np.min(self.history['fus_eer']), self.total_iters-1)
					self.logger.add_pr_curve('E2E ROC', labels=labels, predictions=e2e_scores, global_step=self.total_iters-1)
					self.logger.add_pr_curve('Cosine ROC', labels=labels, predictions=cos_scores, global_step=self.total_iters-1)
					self.logger.add_pr_curve('Fus ROC', labels=labels, predictions=fus_scores, global_step=self.total_iters-1)

					if emb.shape[0]>20000:
						idxs = np.random.choice(np.arange(emb.shape[0]), size=20000, replace=False)
						emb, y_ = emb[idxs, :], y_[idxs]

					self.logger.add_histogram('Valid/Embeddings', values=emb, global_step=self.total_iters-1)
					self.logger.add_histogram('Valid/COS_Scores', values=cos_scores, global_step=self.total_iters-1)
					self.logger.add_histogram('Valid/E2E_Scores', values=e2e_scores, global_step=self.total_iters-1)
					self.logger.add_histogram('Valid/FUS_Scores', values=fus_scores, global_step=self.total_iters-1)
					self.logger.add_histogram('Valid/Labels', values=labels, global_step=self.total_iters-1)

					if self.verbose>1:
						self.logger.add_embedding(mat=emb, metadata=list(y_), global_step=self.total_iters-1)

				if self.verbose>1:
					print(' ')
					print('Current e2e EER, best e2e EER, and epoch: {:0.4f}, {:0.4f}, {}'.format(self.history['e2e_eer'][-1], np.min(self.history['e2e_eer']), 1+np.argmin(self.history['e2e_eer'])))
					print('Current cos EER, best cos EER, and epoch: {:0.4f}, {:0.4f}, {}'.format(self.history['cos_eer'][-1], np.min(self.history['cos_eer']), 1+np.argmin(self.history['cos_eer'])))
					print('Current fus EER, best fus EER, and epoch: {:0.4f}, {:0.4f}, {}'.format(self.history['fus_eer'][-1], np.min(self.history['fus_eer']), 1+np.argmin(self.history['fus_eer'])))

			if self.verbose>1:
				print('Current LR: {}'.format(self.optimizer.optimizer.param_groups[0]['lr']))

			self.cur_epoch += 1

			if self.valid_loader is not None and self.save_cp and (self.cur_epoch % save_every == 0 or self.history['e2e_eer'][-1] < np.min([np.inf]+self.history['e2e_eer'][:-1]) or self.history['cos_eer'][-1] < np.min([np.inf]+self.history['cos_eer'][:-1])):
					self.checkpointing()
			elif self.save_cp and self.cur_epoch % save_every == 0:
					self.checkpointing()

		if self.verbose>1:
			print('Training done!')

		if self.valid_loader is not None:
			if self.verbose>1:
				print('Best e2e eer and corresponding epoch: {:0.4f}, {}'.format(np.min(self.history['e2e_eer']), 1+np.argmin(self.history['e2e_eer'])))
				print('Best cos eer and corresponding epoch: {:0.4f}, {}'.format(np.min(self.history['cos_eer']), 1+np.argmin(self.history['cos_eer'])))
				print('Best fus eer and corresponding epoch: {:0.4f}, {}'.format(np.min(self.history['fus_eer']), 1+np.argmin(self.history['fus_eer'])))

			return [np.min(self.history['e2e_eer']), np.min(self.history['cos_eer'])]
		else:
			return [np.min(self.history['train_loss'])]
示例#3
0
	def train(self, n_epochs=1, save_every=1):

		while (self.cur_epoch < n_epochs):

			np.random.seed()

			if self.verbose>0:
				print(' ')
				print('Epoch {}/{}'.format(self.cur_epoch+1, n_epochs))
				train_iter = tqdm(enumerate(self.train_loader))
			else:
				train_iter = enumerate(self.train_loader)

			train_loss_epoch=0.0

			if self.softmax and not self.pretrain:

				ce_epoch=0.0
				for t, batch in train_iter:
					train_loss, ce = self.train_step(batch)
					self.history['train_loss_batch'].append(train_loss)
					self.history['softmax_batch'].append(ce)
					train_loss_epoch+=train_loss
					ce_epoch+=ce
					self.total_iters += 1

				self.history['train_loss'].append(train_loss_epoch/(t+1))
				self.history['softmax'].append(ce_epoch/(t+1))

				if self.verbose>0:
					print('Total train loss, Triplet loss, and Cross-entropy: {:0.4f}, {:0.4f}, {:0.4f}'.format(self.history['train_loss'][-1], (self.history['train_loss'][-1]-self.history['softmax'][-1]), self.history['softmax'][-1]))

			elif self.pretrain:

				ce_epoch=0.0
				for t, batch in train_iter:
					ce = self.pretrain_step(batch)
					self.history['train_loss_batch'].append(ce)
					ce_epoch+=ce
					self.total_iters += 1

				self.history['train_loss'].append(ce_epoch/(t+1))

				if self.verbose>0:
					print('Train loss: {:0.4f}'.format(self.history['train_loss'][-1]))

			else:

				for t, batch in train_iter:
					train_loss = self.train_step(batch)
					self.history['train_loss_batch'].append(train_loss)
					train_loss_epoch+=train_loss
					self.total_iters += 1

				self.history['train_loss'].append(train_loss_epoch/(t+1))

				if self.verbose>0:
					print('Total train loss, {:0.4f}'.format(self.history['train_loss'][-1]))

			if self.valid_loader is not None:

				scores, labels = None, None

				for t, batch in enumerate(self.valid_loader):
					scores_batch, labels_batch = self.valid(batch)

					try:
						scores = np.concatenate([scores, scores_batch], 0)
						labels = np.concatenate([labels, labels_batch], 0)
					except:
						scores, labels = scores_batch, labels_batch

				self.history['valid_loss'].append(compute_eer(labels, scores))
				if self.verbose>0:
					print('Current validation loss, best validation loss, and epoch: {:0.4f}, {:0.4f}, {}'.format(self.history['valid_loss'][-1], np.min(self.history['valid_loss']), 1+np.argmin(self.history['valid_loss'])))

				self.scheduler.step(self.history['valid_loss'][-1])

			else:
				self.scheduler.step()

			if self.verbose>0:
				print('Current LR: {}'.format(self.optimizer.param_groups[0]['lr']))

			self.cur_epoch += 1

			if self.valid_loader is not None and self.save_cp and (self.cur_epoch % save_every == 0 or self.history['valid_loss'][-1] < np.min([np.inf]+self.history['valid_loss'][:-1])):
					self.checkpointing()
			elif self.save_cp and self.cur_epoch % save_every == 0:
					self.checkpointing()

		if self.verbose>0:
			print('Training done!')

		if self.valid_loader is not None:
			if self.verbose>0:
				print('Best validation loss and corresponding epoch: {:0.4f}, {}'.format(np.min(self.history['valid_loss']), 1+np.argmin(self.history['valid_loss'])))

			return np.min(self.history['valid_loss'])
		else:
			return np.min(self.history['train_loss'])
示例#4
0
    def train(self, n_epochs=1, save_every=1):

        while (self.cur_epoch < n_epochs):

            np.random.seed()

            if self.verbose > 0:
                print(' ')
                print('Epoch {}/{}'.format(self.cur_epoch + 1, n_epochs))
                train_iter = tqdm(enumerate(self.train_loader))
            else:
                train_iter = enumerate(self.train_loader)

            if self.pretrain:

                ce_epoch = 0.0
                for t, batch in train_iter:
                    ce = self.pretrain_step(batch)
                    self.history['train_loss_batch'].append(ce)
                    ce_epoch += ce
                    self.total_iters += 1

                self.history['train_loss'].append(ce_epoch / (t + 1))

                if self.verbose > 0:
                    print('Train loss: {:0.4f}'.format(
                        self.history['train_loss'][-1]))

            else:

                train_loss_epoch = 0.0
                ce_loss_epoch = 0.0
                bin_loss_epoch = 0.0
                for t, batch in train_iter:
                    train_loss, ce_loss, bin_loss = self.train_step(batch)
                    self.history['train_loss_batch'].append(train_loss)
                    self.history['ce_loss_batch'].append(ce_loss)
                    self.history['bin_loss_batch'].append(bin_loss)
                    train_loss_epoch += train_loss
                    ce_loss_epoch += ce_loss
                    bin_loss_epoch += bin_loss
                    self.total_iters += 1

                self.history['train_loss'].append(train_loss_epoch / (t + 1))
                self.history['ce_loss'].append(ce_loss_epoch / (t + 1))
                self.history['bin_loss'].append(bin_loss_epoch / (t + 1))

                if self.verbose > 0:
                    print(' ')
                    print('Total train loss: {:0.4f}'.format(
                        self.history['train_loss'][-1]))
                    print('CE loss: {:0.4f}'.format(
                        self.history['ce_loss'][-1]))
                    print('Binary classification loss: {:0.4f}'.format(
                        self.history['bin_loss'][-1]))
                    print(' ')

            if self.valid_loader is not None:

                e2e_scores, cos_scores, labels = None, None, None

                for t, batch in enumerate(self.valid_loader):
                    e2e_scores_batch, cos_scores_batch, labels_batch = self.valid(
                        batch)

                    try:
                        e2e_scores = np.concatenate(
                            [e2e_scores, e2e_scores_batch], 0)
                        cos_scores = np.concatenate(
                            [cos_scores, cos_scores_batch], 0)
                        labels = np.concatenate([labels, labels_batch], 0)
                    except:
                        e2e_scores, cos_scores, labels = e2e_scores_batch, cos_scores_batch, labels_batch

                self.history['e2e_eer'].append(compute_eer(labels, e2e_scores))
                self.history['cos_eer'].append(compute_eer(labels, cos_scores))

                if self.verbose > 0:
                    print(' ')
                    print(
                        'Current e2e EER, best e2e EER, and epoch: {:0.4f}, {:0.4f}, {}'
                        .format(self.history['e2e_eer'][-1],
                                np.min(self.history['e2e_eer']),
                                1 + np.argmin(self.history['e2e_eer'])))
                    print(
                        'Current cos EER, best cos EER, and epoch: {:0.4f}, {:0.4f}, {}'
                        .format(self.history['cos_eer'][-1],
                                np.min(self.history['cos_eer']),
                                1 + np.argmin(self.history['cos_eer'])))

                self.scheduler.step(
                    np.min([
                        self.history['e2e_eer'][-1],
                        self.history['cos_eer'][-1]
                    ]))

            else:
                self.scheduler.step()

            if self.verbose > 0:
                print('Current LR: {}'.format(
                    self.optimizer.param_groups[0]['lr']))

            self.cur_epoch += 1

            if self.valid_loader is not None and self.save_cp and (
                    self.cur_epoch % save_every == 0
                    or self.history['e2e_eer'][-1] <
                    np.min([np.inf] + self.history['e2e_eer'][:-1])
                    or self.history['cos_eer'][-1] <
                    np.min([np.inf] + self.history['cos_eer'][:-1])):
                self.checkpointing()
            elif self.save_cp and self.cur_epoch % save_every == 0:
                self.checkpointing()

        if self.verbose > 0:
            print('Training done!')

        if self.valid_loader is not None:
            if self.verbose > 0:
                print(
                    'Best e2e eer and corresponding epoch: {:0.4f}, {}'.format(
                        np.min(self.history['e2e_eer']),
                        1 + np.argmin(self.history['e2e_eer'])))
                print(
                    'Best cos eer and corresponding epoch: {:0.4f}, {}'.format(
                        np.min(self.history['cos_eer']),
                        1 + np.argmin(self.history['cos_eer'])))

            return [
                np.min(self.history['e2e_eer']),
                np.min(self.history['cos_eer'])
            ]
        else:
            return [np.min(self.history['train_loss'])]