Пример #1
0
    def system_test(self):
        nclass = len(self.data_loader.meta_data.label_names)

        for fold_id in self.data_loader.meta_data.nfolds:
            for train_mode in ['pretrain_set', 'finetune_set']:
                print('/*========== Test %s model on FOLD %s ==========*/' %
                      (train_mode.upper(), fold_id))

                model = self.inflate_model(self.config,
                                           nclass,
                                           train_mode=train_mode)
                mfile = cfg.get_model_filename(path=path.join(
                    self.config['path'][train_mode], self.attrib_cls),
                                               train_mode=train_mode,
                                               fold=fold_id)
                model.load(mfile)
                print('Loss: %s' % model.model.loss)

                trainer = OGITSModelTrainer(model.model,
                                            self.data_loader,
                                            self.config,
                                            fold_id=fold_id,
                                            train_mode=train_mode,
                                            attrib_cls=self.attrib_cls,
                                            verbose=self.verbose,
                                            overwrite=self.overwrite)
                trainer.test()
                trainer.evaluate()
Пример #2
0
    def system_test(self):
        nclass = len(self.data_loader.meta_data.label_names)

        for fold_id in self.data_loader.meta_data.nfolds:
            for mode in ['pretrain_set', 'finetune_set']:
                print('/*========== Test %s model on FOLD %s ==========*/' %
                      (mode, fold_id))

                model = self.inflate_model(self.config,
                                           nclass,
                                           train_mode=mode)
                mfile = cfg.get_model_filename(path=self.config['path'][mode],
                                               train_mode=mode,
                                               fold=fold_id)
                model.load(mfile)
                print('Loss: %s' % model.model.loss)

                test_gen = DL.batch_handler(
                    batch_type='validation',
                    data_file=self.data_loader.feat_file,
                    fold_lst=self.data_loader.meta_data.fold_list(
                        fold_id, 'test'),
                    config=self.config['model'][mode],
                    meta_data=self.data_loader.meta_data)

                history = ModelValidator.validate_model(
                    model=model.model,
                    batch_gen=test_gen,
                    metrics=self.config['model'][mode]['metrics'])
                print(history)
Пример #3
0
    def system_train(self):
        """
        Pre-training and fine-tuning logic
        """
        print('Model params:')
        pprint.pprint(self.config['model'].toDict())
        dirs.mkdirs(self.config['path']['finetune_set'],
                    self.config['path']['pretrain_set'])

        nclass = len(self.data_loader.meta_data.label_names)

        for fold_id in self.data_loader.meta_data.nfolds:
            if self.config['model']['do_pretrain']:
                print('/*========== Pre-training on FOLD %s ==========*/' %
                      fold_id)

                model = self.inflate_model(self.config,
                                           nclass,
                                           train_mode='pretrain_set')
                print('Pre-train with loss: %s' % model.model.loss)

                trainer = DCASEModelTrainer(model.model,
                                            self.data_loader,
                                            self.config,
                                            fold_id=fold_id,
                                            train_mode='pretrain_set',
                                            verbose=self.verbose,
                                            overwrite=self.overwrite)
                trainer.train()

            if self.config['model']['do_finetune']:
                print('/*========== Fine-tuning on FOLD ==========*/' %
                      fold_id)
                mfile = cfg.get_model_filename(
                    path=self.config['path']['pretrain_set'],
                    train_mode='pretrain_set',
                    fold=fold_id)
                pre_model = self.inflate_model(self.config,
                                               nclass,
                                               train_mode='pretrain_set')
                pre_model.load(mfile)

                pre_model.chage_optimizer(self.config['model']['finetune_set'])
                print('Finetune with loss: %s' % pre_model.model.loss)

                finetuner = DCASEModelTrainer(pre_model.model,
                                              self.data_loader,
                                              self.config,
                                              fold_id=fold_id,
                                              train_mode='finetune_set',
                                              verbose=self.verbose,
                                              overwrite=self.overwrite)
                finetuner.train()
Пример #4
0
    def system_train(self):
        """
        Pre-training and fine-tuning logic
        """
        print('Model params:')
        pprint.pprint(self.config['model'].toDict())
        dirs.mkdirs(
            path.join(self.config['path']['finetune_set'], self.attrib_cls),
            path.join(self.config['path']['pretrain_set'], self.attrib_cls))
        nclass = len(self.data_loader.meta_data.label_names)

        for fold_id in self.data_loader.meta_data.nfolds:
            if self.config['model']['do_pretrain']:
                print('/*========== Pre-training ==========*/')

                model = self.inflate_model(config=self.config, nclass=nclass)
                print('Pre-train with loss: %s' % model.model.loss)

                trainer = OGITSModelTrainer(model.model,
                                            self.data_loader,
                                            self.config,
                                            fold_id=fold_id,
                                            train_mode='pretrain_set',
                                            attrib_cls=self.attrib_cls,
                                            verbose=self.verbose,
                                            overwrite=self.overwrite)
                trainer.train()

            if self.config['model']['do_finetune']:
                print('/*========== Fine-tuning ==========*/')
                mfile = cfg.get_model_filename(path=path.join(
                    self.config['path']['pretrain_set'], self.attrib_cls),
                                               train_mode='pretrain_set',
                                               fold=fold_id)
                pre_model = self.inflate_model(config=self.config,
                                               nclass=nclass)
                pre_model.load(mfile)
                pre_model.chage_optimizer(self.config['model']['finetune_set'],
                                          change_out_unit=True)
                print('Finetune with loss: %s' % pre_model.model.loss)

                finetuner = OGITSModelTrainer(pre_model.model,
                                              self.data_loader,
                                              self.config,
                                              fold_id=fold_id,
                                              train_mode='finetune_set',
                                              attrib_cls=self.attrib_cls,
                                              verbose=self.verbose,
                                              overwrite=self.overwrite)
                finetuner.train()
Пример #5
0
    def __init__(self, model, data, config, **kwargs):
        super(OGITSModelTrainer, self).__init__(model, data, config)

        self.train_mode = kwargs.get('train_mode', 'pretrain_set')
        self.fold_id = kwargs.get('fold_id', 1)
        self.attrib_cls = kwargs.get('attrib_cls', 'manner')
        self.verbose = kwargs.get('verbose', 1)
        self.overwrite = kwargs.get('overwrite', False)

        self.callbacks = []
        mpath = path.join(self.config['path'][self.train_mode],
                          self.attrib_cls)
        self.model_file = cfg.get_model_filename(path=mpath,
                                                 train_mode=self.train_mode,
                                                 fold=self.fold_id)
Пример #6
0
    def __init__(self, model, data, config, **kwargs):
        super(DCASEModelTrainer, self).__init__(model, data, config)

        self.train_mode = kwargs.get('train_mode', 'pretrain_set')
        self.fold_id = kwargs.get('fold_id', 1)
        self.verbose = kwargs.get('verbose', 1)
        self.overwrite = kwargs.get('overwrite', False)

        self.callbacks = []
        self.loss = []
        self.val_loss = []
        self.model_file = cfg.get_model_filename(
            path=self.config['path'][self.train_mode],
            train_mode=self.train_mode,
            fold=self.fold_id)
Пример #7
0
    def _experiment(self, params):
        """
        Calculate model validation error on the current hyper parameters 'params'.
        Hyper parameters are sampled from the search space.
        NOTE: we have to use only validation data set here
        NOTE2: hyperopt is minimizing, so use 100 - microF1, 100 - Acc, but EER!
        """
        self.model_cfg.update(params)
        print('=*' * 40)
        print('\n Trying Model parameters: ')
        pprint.pprint(self.model_cfg.toDict(), indent=2)

        # rebuild model from scratch
        self.model.rebuild(self.init_model_cfg)
        # TODO load pre-trained weights to optimize those Bayes space
        mfile = cfg.get_model_filename(path=path.join(
            self.config['path']['pretrain_set'], self.attrib_cls),
                                       train_mode=self.train_mode,
                                       fold=self.fold_id)
        self.model.load(mfile)
        self.model.chage_optimizer(self.model_cfg, change_out_unit=True)
        ######################

        # init batch generators
        train_gen = DL.batch_handler(batch_type=self.model_cfg['batch_type'],
                                     data_file=self.data.feat_file,
                                     fold_lst=self.data.meta_data.fold_list(
                                         self.fold_id, 'train'),
                                     config=self.model_cfg,
                                     meta_data=self.data.meta_data)

        cv_gen = DL.batch_handler(batch_type='sed_validation',
                                  data_file=self.data.feat_file,
                                  fold_lst=self.data.meta_data.fold_list(
                                      self.fold_id, 'validation'),
                                  config=self.model_cfg,
                                  meta_data=self.data.meta_data)

        def mfom_batch_wrap(xy_gen):
            for x, y in xy_gen.batch():
                yield [y, x], y

        wrap_gen = mfom_batch_wrap(train_gen) \
            if self.is_mfom_objective(self.model.model) \
            else train_gen.batch()
        self._init_callbacks(cv_gen)

        batch_sz = self.model_cfg['batch']
        samp_sz = train_gen.samples_number()
        print('Epoch size: %d observations' % samp_sz)

        # train model
        trial_result = {'params': self.model_cfg.toDict()}
        try:
            start = timer()
            self.model.model.fit_generator(wrap_gen,
                                           steps_per_epoch=samp_sz // batch_sz,
                                           nb_epoch=self.MAX_EPOCHS,
                                           verbose=self.verbose,
                                           workers=1,
                                           callbacks=self.callbacks)
            run_time = timer() - start
            # validate model
            mvals = ModelValidator.validate_model(
                model=self.model.model,
                batch_gen=cv_gen,
                metrics=self.model_cfg['metrics'])
            # loss of the hyperopt
            loss = mvals[self.config['callback']['monitor']]
            loss = loss if self.config['callback'][
                'mode'] == 'min' else 100. - loss
            trial_result.update({
                'validation': mvals,
                'loss': loss,
                'time': run_time,
                'status': STATUS_OK
            })
            return trial_result
        except Exception as e:
            print('[error] Type: %s, %s' % (type(e), e.message))
            print('-' * 30)
            trial_result.update({
                'loss': 999999,
                'time': 0,
                'status': STATUS_FAIL
            })
            return trial_result
        finally:
            train_gen.stop()
            cv_gen.stop()